考虑以下示例(代码段 (0)):
struct X
{
constexpr int get() const { return 0; }
};
void foo(const X& x)
{
constexpr int i = x.get();
}
int main()
{
foo(X{});
}
Run Code Online (Sandbox Code Playgroud)
与所有版本上面的例子编译g++之前g++ 10.x,从来没有下编译clang++。错误信息是:
Run Code Online (Sandbox Code Playgroud)error: 'x' is not a constant expression 8 | constexpr int i = x.get(); |
错误是有道理的,因为x在 的主体中从来不是一个常量表达式foo,但是:
X::get()被标记constexpr并且它不依赖于的状态x;
更改const X&为const X使用每个编译器(在 Godbolt.org 上) 片段 …