Hãy xem xét các mã sau đây:
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;
}
Sử dụng g ++ - 4.8.5, biên dịch mã này cho tôi thông báo lỗi sau:
~/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>’
Tuy nhiên, khi tôi biên dịch bằng g ++ - 8.3 (ví dụ: ideone), mã biên dịch và các chuyên môn khác nhau được xử lý chính xác. Đây có phải là một lỗi trong GCC đã được sửa hay tôi bằng cách nào đó gọi hành vi không xác định (và do đó, sự khác biệt trong hành vi của trình biên dịch là một điểm cần thiết - nó không được xác định)?