模板类中的静态变量初始化

时间:2016-06-27 18:10:44

标签: c++ templates

任何人都能解释为什么这段代码会崩溃吗? 在使用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

1 个答案:

答案 0 :(得分:2)

我相信你所拥有的是static initialization order fiasco的一个实例。简而言之,您不能依赖静态初始化器的顺序。您应该考虑在首次使用模式时使用构造(请参阅相同的链接,下面的一个问题)。

en.cppreference.com有以下说法:

  

1)无序动态初始化,仅适用于未明确专门化的(静态/线程局部)类模板数据成员。相对于所有其他动态初始化,这种静态变量的初始化是不确定地排序的。对于所有其他动态初始化,此类线程局部变量的初始化未被排序。