Aşağıdaki kodu göz önünde bulundurun:
template <typename T> using VoidT = void;
class A {
public:
using TEST = int;
};
class C {
public:
using DIFFERENT = int;
};
template <typename T, typename Enable = void>
class B {
public:
B() = delete;
};
template <typename T>
class B<T, VoidT<typename T::TEST>> {
public:
B() = default;
};
template <typename T>
class B<T, VoidT<typename T::DIFFERENT>> {
public:
B() = default;
};
int main() {
B<A> a;
B<C> b;
return 0;
}
G ++ - 4.8.5 kullanarak, bu kodu derlemek bana aşağıdaki hata iletisini verir:
~/test/compile_test> g++ -std=c++11 test.cpp
test.cpp:31:7: error: redefinition of ‘class B<T, void>’
test.cpp:24:7: error: previous definition of ‘class B<T, void>’
Ancak, g ++ - 8.3 (örneğin, ideone içinde) kullanarak derlediğimde kod derler ve farklı uzmanlıklar doğru davranılır. Bu GCC'de düzeltilen bir hata mıydı, yoksa bir şekilde tanımlanmamış davranışları mı çağırıyorum (ve bu nedenle derleyici davranışındaki fark bir tartışma noktasıdır - tanımsızdır)?