解释

constinit 说明符声明拥有静态或线程存储期的变量。若变量以 constinit 声明,则其初始化声明必须应用 constinit 。若以 constinit 声明的变量拥有动态初始化,则程序非良构。若在初始化声明点无可达的 constinit 声明,则程序非良构,不需要诊断。

constinit 不能和 constexprconsteval 一同使用。声明的变量为引用时, constinit 等价于 constexpr 。声明的变量为对象时, constexpr 强制对象必须拥有静态初始化和常量析构,并使对象有 const 限定,然而 constinit 不强制常量析构和 const 限定。结果是拥有 constexpr 构造函数且无 constexpr 析构函数的类型(例如 std::shared_ptr<T> )的对象可能可以用 constinit ,但不能用 constexpr 声明。

  1. const char *g() { return "dynamic initialization"; }
  2. constexpr const char *f(bool p) { return p ? "constant initializer" : g(); }
  3.  
  4. constinit const char *c = f(true); // OK
  5. // constinit const char *d = f(false); // 错误

constinit 亦能用于非初始化声明,以告知编译器 thread_local 变量已被初始化。

  1. extern thread_local constinit int x;
  2. int f() { return x; } // 无需检查防卫变量

关键词

constinit

示例

本节未完成原因:暂无示例