Betrachten Sie den folgenden Code:
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;
}
Wenn ich diesen Code mit g ++ - 4.8.5 kompiliere, wird folgende Fehlermeldung angezeigt:
~/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>’
Wenn ich jedoch mit g ++ - 8.3 kompiliere (z. B. in ideone), wird der Code kompiliert und die verschiedenen Spezialisierungen werden korrekt behandelt. War dies ein Fehler in GCC, der behoben wurde, oder rufe ich irgendwie undefiniertes Verhalten auf (und daher ist der Unterschied im Compiler-Verhalten ein strittiger Punkt - es ist undefiniert)?