constexpr成员函数不使用这个?

And*_*zos 9 c++ language-lawyer constexpr c++14

请考虑以下两个C++ 14程序:

计划1:

struct S { constexpr int f() const { return 42; } };
S s;
int main() { constexpr int x = s.f(); return x; }
Run Code Online (Sandbox Code Playgroud)

计划2:

struct S { constexpr int f() const { return 42; } };
int g(S s) { constexpr int x = s.f(); return x; }
int main() { S s; return g(s); }
Run Code Online (Sandbox Code Playgroud)

这些程序中的任何一个或两个都不成形吗?

为什么/为什么不呢?

Vau*_*ato 6

这两个项目都是完善的.C++ 14标准要求s.f()是一个常量表达式,因为它用于初始化constexpr变量,实际上它是一个核心常量表达式,因为没有理由不这样做.表达式可能不是核心常量表达式的原因在第5.19节p2中列出.特别是,它表明对表达式的评估必须做几件事之一,在你的例子中都没有做到.

这可能是令人惊讶的,因为在某些情况下,将非常量表达式传递给constexpr函数可能会导致结果为非常量表达式,即使未使用该参数也是如此.例如:

constexpr int f(int) { return 42; }

int main()
{
    int x = 5;
    constexpr auto y = f(x); // ill-formed
}
Run Code Online (Sandbox Code Playgroud)

然而,这是错误形成的原因是因为非常量表达式的左值到右值转换,这是表达式的评估不允许进行的事情之一.在调用的情况下不会发生左值到右值的转换s.f().