从en.cppreference.com/w/cpp/language/initialization:
无序动态初始化,其[原文如此]仅适用于(静态/线程局部)类模板静态数据成员和可变模板(因为C ++ 14)未明确专业。
因此,静态模板似乎更容易受到“静态初始化顺序惨败”(TSIOF)的更差版本的攻击(即在翻译单元中无序)。
使用constexpr可以消除此漏洞吗?
即下面的代码的输出保证是success吗?
显然,由于这个问题的性质,实际的例子不足以作为答案。需要引用标准中的报价。(首选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";
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,如果有人是专家对这个我有一个相关的,悬而未决的问题(这将是容易对这样的专家来回答)这里。此外,如果我对其他问题的回答是否定的(即constexpr对所有翻译单位都无济于事),这里的含义是什么?
更新:我需要澄清我的关注在这里。原始问题标题询问constexpr模板变量是否要考虑初始化顺序。我已经澄清了。我不担心示例中是否发生了动态初始化。不是。我担心的是,由于不能在动态初始化情况下假设有序初始化,因此可以在常量初始化情况下假设吗?在看到动态初始化的模板变量(在同一翻译单元内)的行为之前,我什至从未想到过这一点。但是,由于动态初始化的静态持续时间模板变量不提供有序的初始化,所以我现在没有理由假设常量初始化的静态持续时间的模板变量也保证了有序的初始化。
同样,我认为没有理由假定编译器中的常量初始化器不需要动态初始化器就可以初始化。在标准中没有警告说没有恒定的初始化是不够的。
我意识到有些人可能认为这是个过分关注的问题,但是我正在开发对安全至关重要的软件,并且在解决此问题之前,我公司已暂停采用C ++ 14。
c++ initialization global-variables language-lawyer constexpr