在为我遇到的这个问题制作MCVE时,我发现不同编译器之间存在以下差异:
考虑以下代码:
// constexpr int f(); // 1
constexpr int g() {
constexpr int f(); // 2
return f();
}
constexpr int f() {
return 42;
}
int main() {
constexpr int i = g();
return i;
}
这段代码在Clang 3.8.0上可以编译通过,但在GCC 6.1.0上会出现以下错误:
error: 'constexpr int f()' used before its definition
将 // 2
注释掉并取消注释 // 1
,两个编译器都可以工作。
有趣的是,将 f
的定义移动到 // 1
的位置进行编译会通过,但会在 // 2
处触发警告:
warning: inline function 'constexpr int f()' used but never defined
哪个编译器是正确的?