作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
以下代码无法使用 g++/clang++ 进行编译。
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
}
错误信息是:x must be initailized by a constant expression
但是从行 (ok) 可以看出 bar() 是 constexpr。
如果我将 foo() 的主体更改为
constexpr int foo(const int v) {
return bar(v);
}
没关系!
我不太清楚,为什么第一种形式不可能。我使用了 g++-6.2.1、g++-7.0.0 和 clang++-3.9.0
最佳答案
修复是这个
constexpr int foo(const int v) {
auto x = bar(v);
return v;
}
关键字 constexpr 意味着两个非常不同的东西。 constexpr 变量必须在编译时求值,而 constexpr 函数必须可以在编译时求值。没有什么可以阻止您在运行时调用 foo 。这意味着……
如果在编译时调用 foo,则不会存储 x,它是编译器中的临时变量,因此将其设为 constexpr 没有任何意义。
只有在运行时计算 foo 时,x 的 constexpr'ness 才有意义,在这种情况下它不能是 constexpr,这会导致错误。
关于c++ - 嵌套 conexpr 函数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40690468/
以下代码无法使用 g++/clang++ 进行编译。 constexpr int bar(int v) { if (v > 0){ return v * 2; }
我是一名优秀的程序员,十分优秀!