Here's a minimal example:
#include <iostream> struct B { B() { x = 42; } static int x; }; int B::x; template <int N> struct A { int foo() { return b.x; } static B b; }; template<int N> B A<N>::b; //template struct A<2>; // explicit instantiation with N = 2 (!) int main(int argc, char **argv) { std::cout << A<1>().foo() << std::endl; return 0; } This program writes 42 using g++ 4.9.2, but writes 0 using Visual Studio 2015 RC. Also, if I uncomment the explicit instantiation, VS2015RC also gives 42, which is quite interesting, as the template parameter here is different from the one used in the main function.
Is this a bug? I assume that g++ is correct, as there is a reference to b inside foo, so B's constructor should be called.
EDIT: There is a simple workaround - if there is a non-static variable in B, that is referenced in A, VS2015RC will compile correctly:
// ... struct B { B() { x = 42; } static int x; int y; // <- non-static variable }; // ... template <int N> struct A { int foo() { b.y; return b.x; } // <- reference to b.y static B b; }; This seems to work, even though b.y, as a statement, is obviously NOP.