如您所知,this
是所有非静态成员函数的参数。参数永远不是常量表达式。所以this
不能用在常量表达式中。
当您初始化非静态成员变量时,例如:
int i = 0;
此初始化将在运行时进行。不要认为你的空 ( defaulted
) 构造函数什么都不做。它实际上必须i
在运行时初始化为零。但是编译器应该如何生成一个consteval
执行运行时任务的函数(如您的默认 ctor)?这只是一个矛盾。
让我向您展示一个类似的场景:
consteval int multiply( const int op1, const int op2 )
{
return op1 * op2;
}
int main( )
{
constexpr int op1 { 2 };
constexpr int op2 { 3 };
std::cout << multiply( op1, op2 ) << '\n'; // compiles for obvious reasons
int op3 { 2 };
int op4 { 3 };
std::cout << multiply( op3, op4 ) << '\n'; // doesn't compile
}
和:
test.cpp: In function 'int main()':
test.cpp:57:32: error: the value of 'op3' is not usable in a constant expression
57 | std::cout << multiply( op3, op4 ) << '\n';
| ^~~
test.cpp:55:13: note: 'int op3' is not const
55 | int op3 { 2 };
| ^~~
在第一次调用中,consteval
函数正在接收constexpr
参数。所以很开心。
在第二次调用中,它接收非constexpr
参数。
this
因为你的consteval
ctor 会导致类似的情况:
test.cpp: In constructor 'A::A(int)':
test.cpp:41:22: error: 'this' is not a constant expression
41 | A( int ) : A() { }
| ^