以下代码不能用g ++ / clang ++编译。
sed '1d' file | wc -l
错误消息是:x必须由常量表达式
初始化但是从行(ok)你看到bar()是constexpr。
如果我将foo()的主体更改为
constexpr int bar(int v) {
if (v > 0){
return v * 2;
}
return 2;
}
constexpr int foo(const int v) {
constexpr auto x = bar(v); // error
return v;
}
int main() {
constexpr auto a = foo(1);
constexpr auto b = bar(1); // ok
}
好的!
我不清楚这一点,为什么第一种形式是不可能的。 我使用g ++ - 6.2.1,g ++ - 7.0.0和clang ++ - 3.9.0
答案 0 :(得分:5)
修复就是这个
constexpr int foo(const int v) {
auto x = bar(v);
return v;
}
关键字constexpr意味着两个非常不同的东西。必须在编译时评估constexpr变量 ,而在编译时必须能够评估constexpr函数。没有什么可以阻止你在运行时调用foo。这意味着......
如果在编译时调用foo然后不存储x,则它是编译器中的临时变量,因此使其成为constexpr没有任何意义。
x的constexpr'ness只有在运行时评估foo才有意义,在这种情况下它不能是constexpr,这会导致错误。