问题标签 [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.
c++ - “constinit”和“constexpr”之间的真正区别是什么?
如上面的代码所示,我找不到constinit
和之间的任何区别constexpr
。
constinit
和之间的真正区别是constexpr
什么?
更新:
相关的 C++20 中有什么?constinit
没有明确说明 和 之间的constinit
区别constexpr
。
c++ - 什么时候使用 constinit 和 consteval?
的用法constexpr
非常简单,即确保可以在编译时评估代码本身。
但是 C++ 20 的最新特性提供constinit
并且consteval
有点令人困惑。constinit
有人可以提供and的实际用例consteval
吗?
c++ - 什么时候调用 constinit 对象的析构函数?
一般来说,静态对象的析构函数的调用顺序与构造函数的相反。据我了解, constinit 对象是在编译时初始化的,因此应该在“普通”静态对象的析构函数之后调用它们的析构函数。
该程序
(使用 GCC 10),但是,给出了输出
即 constinit 对象在“正常”静态对象之前被销毁(尽管它是较早构造的)。“逆序”规则对 constinit 对象不再有效吗?
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 初始化映射。我评论了每一种可能性,我想解释一下。
- Map 被初始化为非常量变量。我知道这不起作用,它不是常量变量,也不是初始化的编译时间
- Map 被初始化为const变量。这也不起作用,即使变量是常量,也不能保证它会在编译时创建。
- Map 被初始化为constexpr变量。这保证了变量将在编译时被初始化。它也意味着常量,所以我们有编译时常量变量。这可以正常工作。(https://en.cppreference.com/w/cpp/language/constexpr)
- Map 被初始化为constinit变量。现在, constinit 保证表达式是零初始化或常量初始化的。我用常量初始化,因此在编译时应该知道这个变量(将静态变量的初始值设置为编译时常量。- https://en.cppreference.com/w/cpp/language/constant_initialization)但是它并不意味着常量,所以我们有编译时非常量变量,这个 static_assert 不能工作。
- Map 被初始化为constinit con t 变量。现在我们有了编译时常量变量,但 static_assert 拒绝工作。static_assert 需要 bool 类型的上下文转换的常量表达式(https://en.cppreference.com/w/cpp/language/static_assert),它是 T 类型的转换常量表达式是隐式转换为 T 类型的表达式,其中转换后的表达式是一个常数表达式。为什么这不起作用?
根据 cppInsights,编译器生成的代码与 constinit const 和 constexpr 相同。
c++ - 在哪种实际情况下“const constinit”有用?
@Vittorio Romeo对这个问题的回答很好地解释了。在他的回答中,提到了以下内容:constinit
constexpr
不等同于const constinit
,因为前者要求不断破坏,而后者则不然。
虽然很清楚,但我看不到任何实际用途。在这种情况下会const constinit
使用,但constexpr
不能。在我能想到的任何情况下,对于在运行时通过 可以更改和不能更改的任何类型T
,constinit
常量const
破坏应该是一个微不足道的限制添加。我错过了什么吗?
c++ - 如何保证使用编译时间常数初始化堆栈变量
在 C++20 中,我们现在拥有constinit
. constexpr
和consteval
。
我现在可以保证静态变量是由 aconstexpr
或consteval
函数的结果初始化的constinit
。好的
我还可以保证使用consteval
在编译时执行的函数的结果来初始化堆栈变量。
但是如何强制运行一个constexpr
函数来计算编译时的结果以在堆栈上初始化一个变量?
如果我们使用constexpr
该变量是隐式的 const 并且constinit
在这里是不允许的。是否有机会使用函数的编译时间评估结果初始化此 var 而constexpr
不会使其成为 const?我只是想知道为什么constinit
仅限于静态变量。对我来说没有多大意义。