在同一个编译单元中,C++标准指出静态初始化顺序已被很好地定义 - 它是静态对象声明的顺序。但是使用Sun Studio 12编译器时遇到了直觉行为。我已经定义了一个模板类helper<T>
,其中包含T
类型的静态成员_data
以及使用_data
(调用foo
)的静态成员函数。在我的.cpp文件我有这个上面的main():模板的typedefs是否保存静态初始化顺序?
struct A { /* some definition */ };
typedef helper<int> s0;
typedef helper<A> s1;
注意,对于helper<int>
typedef的自带之前为helper<A>
typedef的。因此根据标准,我预计helper<int>::_data
将在helper<A>::_data
之前构建(记住_data
是一个静态成员)。在GCC上就是这样,在Sun上它不是。
这是有问题的,因为A的构造函数使用helper<int>::_data
。我只有一个编译单元,没有更早的helper<A>
潜在实例,所以我认为应该定义好顺序。这是Sun编译器的bug,还是typedef在技术上不构成定义/实例?我的意思是,标准允许Sun编译器的行为?
我主要有如下():
int main()
{
//Swapping the order of these has no effect on Sun
s0::foo();
s1::foo();
}
有的S0或S1没有其他用途。
从我的理解代码*不*声明对象。帮手有一个静态数据成员。所以每当模板被实例化时,都会创建一个静态数据成员(一个对象)。 typedef实例化模板....对吧? –
2009-07-10 16:03:37
typedef没有实例化模板。 – 2009-07-10 16:05:09