【发布时间】:2016-09-28 08:24:33
【问题描述】:
在为我偶然发现的this 问题生成 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
哪个编译器是正确的?
【问题讨论】:
-
标准对此似乎不太清楚。我们这里需要一位强大的律师 :)
标签: c++ language-lawyer constexpr function-declaration compiler-bug