gpt4 book ai didi

c++ - constexpr(即常量初始化)模板变量的初始化顺序是否得到保证?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:39:28 25 4
gpt4 key购买 nike

来自 en.cppreference.com/w/cpp/language/initialization :

Unordered dynamic initialization, which [sic] applies only to (static/thread-local) class template static data members and variable templates (since C++14) that aren't explicitly specialized.

因此,静态模板似乎容易受到更差版本的 The Static Initialization Order Fiasco (TSIOF) 的攻击。 (即在翻译单元内无序)。

使用 constexpr 是否可以消除此漏洞?

即以下代码的输出是否保证 成功

显然,由于这个问题的性质,工作示例不足以作为答案;需要从标准中引用。(首选 C++17 答案)

#include<cassert>

template<class T> static constexpr T a = 41;
template<class T> static constexpr T b = a<T>+1;
int main(){
assert(b<int> == 42);
std::cout <<"success\n";
}

顺便说一句,如果有人是这方面的专家,我有一个相关的、未回答的问题(这样的专家很容易回答)here .此外,如果对 my other question 的回答会产生什么影响?是负数(即 constexpr 对跨翻译单元没有帮助)?

更新:我需要在这里澄清我的担忧。最初的问题标题询问初始化顺序是否是 constexpr 模板变量的一个问题。我已经澄清了。我不关心示例中是否进行了动态初始化;它不是。我担心的是,由于在动态初始化情况下不能假设有序初始化,那么在常量初始化情况下是否可以假设?在看到动态初始化模板变量(在同一个翻译单元内)的行为之前,我从来没有想过这一点。然而,由于动态初始化、静态持续时间模板变量不提供有序初始化,我现在看不出有理由假设常量初始化、静态持续时间模板变量也保证了有序初始化。我需要 100% 确定模板变量的常量初始化按照它们在 TU 中的定义顺序进行。

同样,如果动态初始化程序不需要,我认为没有理由假定编译器内的常量初始化程序需要按顺序初始化。标准中没有常量初始化无序的警告是不够的。

我意识到有些人可能认为这是过度关注,但我正在开发安全关键软件,我的公司已暂停采用 C++14,直到这个问题得到解决。

最佳答案

基于 basic.start.static :

Constant initialization is performed if a variable or temporary object with static or thread storage duration is initialized by a constant initializer for the entity.

在你的代码中:

template<class T> static constexpr T a = 41; // constant initialization

正在进行常量初始化,这使得:

template<class T> static constexpr T b = a<T>+1;

由于模板的持续评估,使用 42 进行初始化。

其中指出(来自 expr.const/8.7):

a variable whose name appears as a potentially constant evaluated expression that is either a constexpr variable or is of non-volatile const-qualified integral type or of reference type.

因此,可以保证输出总是“成功”

注意 来自 basic.start.static/2 :

Together, zero-initialization and constant initialization are called static initialization

-- 不是动态初始化

关于c++ - constexpr(即常量初始化)模板变量的初始化顺序是否得到保证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50401555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com