struct test {
int var;
consteval test(int i) : var{i}
{
static_assert(i == 3);
}
};
int main()
{
constexpr test t{3};
}
这被拒绝了:
$ g++ c.cpp -std=c++20
c.cpp: In constructor ‘consteval test::test(int)’:
c.cpp:8:25: error: non-constant condition for static assertion
8 | static_assert(i == 3);
| ~~^~~~
c.cpp:8:23: error: ‘i’ is not a constant expression
8 | static_assert(i == 3);
| ^
如果保证在编译时评估构造函数,为什么我不能使用
static_assert
?
这样不行。
当您在函数定义中写入
static_assert(i == 3);
时,您是在要求编译器在编译函数定义时检查该条件是否为真。那时 i
是未知的。
形式上,
i == 3
本身必须是常量表达式,但i
在常量表达式中不可用,因为它不是编译时常量(函数参数永远不是)。