根据我从这个答案中收集到的信息,constexpr
如果尚未声明函数,则函数的结果不是常量表达式。令我惊讶的是以下代码片段:
constexpr int f();
constexpr int g() {
return f();
}
constexpr int f() {
return 42;
}
int main() {
constexpr int i = g();
return i;
}
这编译没有麻烦并且有效。正如我所期望的那样,将的f
定义移过 main triggers 。error: 'constexpr int f()' used before its definition
我认为它可以工作,因为f
在调用之前已经定义了g
,因此两个调用都是常量表达式。
为什么是f()
并且g()
显然是常量表达式,即使f
在调用时没有定义g
?标准是如何描述的?
我已经在 Coliru 的 GCC 6.1.0 和 Clang 3.8.0 上对此进行了测试。