c++ - const 可以,但不是 constexpr?

标签 c++ c++11 constants constexpr

使用 constexpr 指定的函数 foo_constexpr 我有如下所示的代码:

const auto x = foo_constexpr(y);
static_assert(x==0);

x 的声明更改为 constexpr 时,在什么情况下代码可能无法编译? (毕竟,x 必须已经是用于 static_assert 的常量表达式。)即:

constexpr auto x = foo_constexpr(y);
static_assert(x==0);

最佳答案

一般中,当 foo_constexpr 的执行违反常量表达式的要求时,它可能无法编译。请记住,constexpr 函数不是始终为常量表达式的函数。相反,它是一个可以为至少一个输入生成常量表达式的函数!而已。

所以如果我们要编写这个完全合法的函数:

constexpr int foo_constexpr(int y) {
  return y < 10 ? 2*y : std::rand();
}

然后我们会得到:

constexpr int y = 10;
const     auto x1 = foo_constexpr(y); // valid, execution time constant
constexpr auto x2 = foo_constexpr(y); // invalid, calls std::rand

当然,如果 x 已经在常量表达式(例如静态断言)中可用,则更改为 constexpr 不会导致失败发生。

关于c++ - const 可以,但不是 constexpr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57669579/

相关文章:

c++ - 将数组中的所有元素与另一个数组进行比较

c++ - Eclipse C++ OpenGL - 无法构建项目

C++ - 最佳实践 : `using std::cout` vs `std::cout`

c++ - 如何将 int 复制到 boost/std::char 数组?

c++ - C++11标准§12.6.2/2中单词 "constructor' s class"的解释

java - Cucumber Selenium (Java) - PageFactory - NullPointEreException 获取 URL

c++ - 从指针到 const 指针的无效转换

c++ - C++ 库的目录结构

c++ - 函数返回类型样式

c++ - const 函数可以调用局部对象上的非常量函数吗?