static_assert 在 consteval 构造函数中被拒绝

问题描述 投票:0回答:1
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

c++ static-assert
1个回答
0
投票

这样不行。

当您在函数定义中写入

static_assert(i == 3);
时,您是在要求编译器在编译函数定义时检查该条件是否为真。那时
i
是未知的。

形式上,

i == 3
本身必须是常量表达式,但
i
在常量表达式中不可用,因为它不是编译时常量(函数参数永远不是)。

© www.soinside.com 2019 - 2024. All rights reserved.