请考虑以下代码:
#include <iostream>
template <typename T> struct A
{
T x;
A(T X) : x(X) { }
static const A a;
};
template <typename T> const A<T> A<T>::a(5);
template <typename T> struct B : public A<T>
{
B(T X) : A<T>(X) { }
static const B b;
};
template <typename T> const B<T> B<T>::b(A<T>::a.x);
int main()
{
//auto test0 = A<int>::a.x;
auto test1 = B<int>::a.x;
auto test2 = B<int>::b.x;
auto test3 = A<int>::a.x;
std::cout << "test1 = " << test1 << "\ttest2 = " << test2 <<
"\ttest3 = " << test3 << std::endl;
return 0;
}
Running this code可能会提供以下文字:
test1 = 5 test2 = 5 test3 = 5
但是直到2015年才在任何Visual Studio上运行.VS产生:
test1 = 5 test2 = 0 test3 = 5
除非你取消注释main()中test0变量的定义。为什么呢?
看起来MSVC ++没有初始化基本模板结构静态成员,除非在使用派生结构之前显式实例化它。这可能与动态常量初始化有关,但我不确定这里到底发生了什么。
如何克服这种行为?我每次都需要B<int>::b.x
等于B<int>::a.x
,而不必强迫自己记住首先实例化A<int>
。
Hackish trickeries是可以接受的。感谢。