使用 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/