解释
constinit
说明符声明拥有静态或线程存储期的变量。若变量以 constinit
声明,则其初始化声明必须应用 constinit
。若以 constinit
声明的变量拥有动态初始化,则程序非良构。若在初始化声明点无可达的 constinit
声明,则程序非良构,不需要诊断。
constinit
不能和 constexpr
或 consteval
一同使用。声明的变量为引用时, constinit
等价于 constexpr
。声明的变量为对象时, constexpr
强制对象必须拥有静态初始化和常量析构,并使对象有 const 限定,然而 constinit
不强制常量析构和 const 限定。结果是拥有 constexpr 构造函数且无 constexpr 析构函数的类型(例如 std::shared_ptr<T> )的对象可能可以用 constinit
,但不能用 constexpr
声明。
- const char *g() { return "dynamic initialization"; }
- constexpr const char *f(bool p) { return p ? "constant initializer" : g(); }
- constinit const char *c = f(true); // OK
- // constinit const char *d = f(false); // 错误
constinit
亦能用于非初始化声明,以告知编译器 thread_local
变量已被初始化。
- extern thread_local constinit int x;
- int f() { return x; } // 无需检查防卫变量
关键词
示例
本节未完成原因:暂无示例 |
当前内容版权归 cppreference 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 cppreference .