在Visual Studio

时间:2016-06-07 01:49:04

标签: c++ visual-studio templates static initialization

请考虑以下代码:

#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是可以接受的。感谢。

0 个答案:

没有答案