@Vittorio Romeo对这个问题的回答很好地解释了constinit
。在他的回答中,提到了以下内容:
constexpr
不等同于const constinit
,因为前者要求持续销毁,而后者则不然。
虽然很清楚,但我看不出它有任何实际用途。在哪种情况下会使用const constinit
,但constexpr
不能。在我能想到的任何情况下,对于任何类型的T
,它可以是constinit
,并且在运行时不能通过const
进行更改,常量销毁应该是一个微不足道的限制。我是不是错过了什么?
如果您对外部代码有依赖,无论出于何种原因都无法更改,并且看起来像这个
struct A {
~A() {}
};
这意味着A
不是字面类型,因为它没有constexpr
析构函数(很可能是疏忽(。然而,它可以在编译时构造,因此是constinit
。
一个可能的实际案例:
struct AtExit
{
~AtExit() { std::cout << "End"; }
};
演示
(通过使用函子对类进行模板化更有用(。