gpt4 book ai didi

c++ - 是否保证初始化顺序

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:10:32 27 4
gpt4 key购买 nike

我正在使用类似于以下代码部分的内容来进行一些初始化。我知道 p<T>::i_ 的初始化是无序的。我相信h是有序的,所以我应该能够推断出它的初始化顺序。鉴于 p 的标题包含在 h 的定义之前, 有没有保证 p<T>::i_将在 h 之前初始化?

struct helper
{
template <typename T>
helper(const T&, int i)
{
p<T>::i_::push_back(i);
}
};
static helper h;

类 p 定义如下。

template <typename T>
struct p
{
static std::vector<int> i_;
};
template <typename T>
std::vector<int> p<T>::i_;

最佳答案

具有静态存储持续时间的对象的初始化顺序在翻译单元之间是不确定的,并且在每个翻译单元内是顺序的。

在您的特定情况下,事情会更复杂,因为具有静态存储的对象之一是模板类的静态成员。这实际上意味着访问成员 p<T>::i_ 的每个翻译单元。将创建符号,并添加适当的初始化代码。稍后链接器将选择其中一个实例并保留它。即使它看起来像 p<T>::i_定义之前 h在您的翻译单元中,您不知道 p<T>::i_ 的哪个实例将由链接器保留,并且可能是不同翻译单元中的一个,因此不能保证顺序。

一般来说,拥有全局对象是个坏主意,我建议您尝试在没有这些全局对象的情况下重新设计您的程序。

关于c++ - 是否保证初始化顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18474276/

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