问题标签 [constinit]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
6970 浏览

c++ - 什么是 C++20 中的`constinit`?

constinit是P1143中提出的 C++20 中的新关键字说明符。

标准中提供了以下示例:

想到几个问题:

  • 是什么constinit意思?为什么介绍它?我们应该在哪些情况下使用它?

  • 它是否使变量不可变?是暗示const还是constexpr

  • 变量可以同时是constconstinit吗?constexpr和怎么样constinit

  • 说明符可以应用于哪些变量?为什么我们不能将它应用于非static、非thread_local变量?

  • 它有什么性能优势吗?

该问题旨在用作constinit一般即将提出的问题的参考。

0 投票
1 回答
160 浏览

c++ - C++20 `constinit` 可以免除对漂亮反制成语的需要吗?

引入 C++20constinit以避免静态初始化顺序惨败。

可以constinit放弃对漂亮的反习用语的需要(例如初始化std::cout)吗?

0 投票
1 回答
227 浏览

c++ - “constinit”和“constexpr”之间的真正区别是什么?

如上面的代码所示,我找不到constinit和之间的任何区别constexpr

constinit和之间的真正区别是constexpr什么?


更新:

相关的 C++20 中有什么?constinit没有明确说明 和 之间的constinit区别constexpr

0 投票
0 回答
862 浏览

c++ - 什么时候使用 constinit 和 consteval?

的用法constexpr非常简单,即确保可以在编译时评估代码本身。

但是 C++ 20 的最新特性提供constinit并且consteval有点令人困惑。constinit有人可以提供and的实际用例consteval吗?

0 投票
1 回答
119 浏览

c++ - 什么时候调用 constinit 对象的析构函数?

一般来说,静态对象的析构函数的调用顺序与构造函数的相反。据我了解, constinit 对象是在编译时初始化的,因此应该在“普通”静态对象的析构函数之后调用它们的析构函数。

该程序

(使用 GCC 10),但是,给出了输出

即 constinit 对象在“正常”静态对象之前被销毁(尽管它是较早构造的)。“逆序”规则对 constinit 对象不再有效吗?

0 投票
3 回答
203 浏览

c++ - 使用 constinit const 时 static_assert 失败。混淆 constinit、constinit const、constexpr、const、非常量变量

我有一个关于编译时函数的问题。我知道 static_assert 应该只适用于可以在编译时评估/计算的类型。所以它不适用于 std::string (但 gcc10 不支持 constexpr std::string),但可以使用 std::array (当我在编译时知道大小时)。我正在观看 Jason Turner 的 C++ Weekly,所以这个片段来自这一集https://www.youtube.com/watch?v=INn3xa4pMfg

代码在这里:https ://godbolt.org/z/e3WPTP

我正在玩这个示例并发现 static_assert 不适用于 constinit const 初始化映射。我评论了每一种可能性,我想解释一下。

  1. Map 被初始化为非常量变量。我知道这不起作用,它不是常量变量,也不是初始化的编译时间
  2. Map 被初始化为const变量。这也不起作用,即使变量是常量,也不能保证它会在编译时创建。
  3. Map 被初始化为constexpr变量。这保证了变量将在编译时被初始化。它也意味着常量,所以我们有编译时常量变量。这可以正常工作。(https://en.cppreference.com/w/cpp/language/constexpr
  4. Map 被初始化为constinit变量。现在, constinit 保证表达式是零初始化或常量初始化的。我用常量初始化,因此在编译时应该知道这个变量(将静态变量的初始值设置为编译时常量。- https://en.cppreference.com/w/cpp/language/constant_initialization)但是它并不意味着常量,所以我们有编译时非常量变量,这个 static_assert 不能工作。
  5. Map 被初始化为constinit con t 变量。现在我们有了编译时常量变量,但 static_assert 拒绝工作。static_assert 需要 bool 类型的上下文转换的常量表达式(https://en.cppreference.com/w/cpp/language/static_assert),它是 T 类型的转换常量表达式是隐式转换为 T 类型的表达式,其中转换后的表达式是一个常数表达式。为什么这不起作用?

根据 cppInsights,编译器生成的代码与 constinit const 和 constexpr 相同。

0 投票
2 回答
102 浏览

c++ - 在哪种实际情况下“const constinit”有用?

@Vittorio Romeo对这个问题的回答很好地解释了。在他的回答中,提到了以下内容:constinit

constexpr不等同于const constinit,因为前者要求不断破坏,而后者则不然。

虽然很清楚,但我看不到任何实际用途。在这种情况下会const constinit使用,但constexpr不能。在我能想到的任何情况下,对于在运行时通过 可以更改和不能更改的任何类型Tconstinit常量const破坏应该是一个微不足道的限制添加。我错过了什么吗?

0 投票
2 回答
108 浏览

c++ - 如何保证使用编译时间常数初始化堆栈变量

在 C++20 中,我们现在拥有constinit. constexprconsteval

我现在可以保证静态变量是由 aconstexprconsteval函数的结果初始化的constinit。好的

我还可以保证使用consteval在编译时执行的函数的结果来初始化堆栈变量。

但是如何强制运行一个constexpr函数来计算编译时的结果以在堆栈上初始化一个变量?

如果我们使用constexpr该变量是隐式的 const 并且constinit在这里是不允许的。是否有机会使用函数的编译时间评估结果初始化此 var 而constexpr不会使其成为 const?我只是想知道为什么constinit仅限于静态变量。对我来说没有多大意义。