据我从这个答案中了解到,如果函数尚未声明,
constexpr
函数的结果不是常量表达式。令我惊讶的是以下代码片段:constexpr int f();
constexpr int g() {
return f();
}
constexpr int f() {
return 42;
}
int main() {
constexpr int i = g();
return i;
}
这段代码可以编译并正常工作。将f
的定义移到main函数之后就会触发错误:error: 'constexpr int f()' used before its definition
,这是我预料中的。
我猜测它可行是因为在调用g
之前已经定义了f
,因此两次调用都是常量表达式。
为什么f()
和g()
看起来是常量表达式,即使f
在被g
调用时还没有定义?标准如何描述这一点?
我已在Coliru的GCC 6.1.0和Clang 3.8.0上进行了测试。
constexpr
function” ? - Kerrek SBconstexpr
函数只有在被odr-used
时才需要定义。因此,即使g()
中没有f()
的定义,编译器也可以通过简单的声明猜测出g()
的主体,但是要实际调用g()
,您需要f()
的定义,因为调用函数被视为odr-use
。所以,是的,给定的答案是有效的,但我认为这就是OP感到困惑的地方。 - KABoissonneault