任何人都能解释为什么这段代码会崩溃吗? 在使用mingw和ubuntu的两个窗口上都有相同的行为。
每个调试器传递给构造函数的参数“a”是“优化的”。
当我尝试访问静态成员二_;
时发生崩溃three.h
#ifndef THREE_H
#define THREE_H
#include <string>
class One
{
public:
One(const std::string& a)
: a_(a)
{
}
std::string a_;
};
template<typename P>
class Two : public One
{
public:
Two()
: One(P::name)
{
}
std::string foo()
{
return a_;
}
};
template<typename T>
class Three
{
public:
struct Info
{
static std::string name;
};
typedef Two<Info> Two_t;
static Two_t two_;
};
template < typename T >
std::string Three<T>::Info::name = std::string("aaaa");
template < typename T >
typename Three<T>::Two_t Three<T>::two_ = Three<T>::Two_t();
#endif // THREE_H
答案 0 :(得分:2)
我相信你所拥有的是static initialization order fiasco的一个实例。简而言之,您不能依赖静态初始化器的顺序。您应该考虑在首次使用模式时使用构造(请参阅相同的链接,下面的一个问题)。
en.cppreference.com有以下说法:
1)无序动态初始化,仅适用于未明确专门化的(静态/线程局部)类模板数据成员。相对于所有其他动态初始化,这种静态变量的初始化是不确定地排序的。对于所有其他动态初始化,此类线程局部变量的初始化未被排序。