다음 코드를 고려하십시오.
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를 사용하여이 코드를 컴파일하면 다음과 같은 오류 메시지가 나타납니다.
~/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>’
그러나 g ++-8.3 (예 : ideone)을 사용하여 컴파일하면 코드가 컴파일되고 다른 전문화가 올바르게 처리됩니다. 이것은 GCC의 버그입니까? 아니면 어떻게 든 정의되지 않은 동작을 호출합니까 (따라서 컴파일러 동작의 차이는 문제가됩니다-정의되지 않았습니다)?