对于静态成员初始化,我使用嵌套的辅助结构,该结构适用于非模板化类。但是,如果封闭类是由模板参数化的,则如果未在主代码中访问辅助对象,则不会实例化嵌套的初始化类。为了说明,一个简化的示例(在我的情况下,我需要初始化一个向量)。
#include <string>
#include <iostream>
struct A
{
struct InitHelper
{
InitHelper()
{
A::mA = "Hello, I'm A.";
}
};
static std::string mA;
static InitHelper mInit;
static const std::string& getA(){ return mA; }
};
std::string A::mA;
A::InitHelper A::mInit;
template<class T>
struct B
{
struct InitHelper
{
InitHelper()
{
B<T>::mB = "Hello, I'm B."; // [3]
}
};
static std::string mB;
static InitHelper mInit;
static const std::string& getB() { return mB; }
static InitHelper& getHelper(){ return mInit; }
};
template<class T>
std::string B<T>::mB; //[4]
template<class T>
typename B<T>::InitHelper B<T>::mInit;
int main(int argc, char* argv[])
{
std::cout << "A = " << A::getA() << std::endl;
// std::cout << "B = " << B<int>::getB() << std::endl; // [1]
// B<int>::getHelper(); // [2]
}
使用g ++ 4.4.1:
[1]和[2]评论:
A =你好,我是A。
按预期工作
[1]条未评论:
A =你好,我是A。
B =
我希望InitHelper初始化mB
[1]和[2]未评论:
A =你好,我是A。
B =你好,我是B。
按预期工作
[1]评论,[2]未评论:
Segfault在[3]的静态初始化阶段
因此,我的问题是:这是编译器错误还是监视器和椅子之间的错误?如果是后者,是否存在一种优雅的解决方案(即,无需显式调用静态初始化方法)?
更新I:
这似乎是理想的行为(在ISO / IEC C ++ 2003标准14.7.1中定义):
除非已明确实例化或显式实例化了类模板或成员模板的成员,否则在需要成员定义存在的上下文中引用专门化时,将隐式实例化成员的专门化。特别是,除非静态数据成员本身以要求静态数据成员的定义存在的方式使用,否则不会发生静态数据成员的初始化(以及任何相关的副作用)。
杨魅力
蛊毒传说
相关分类