Pertimbangkan kode berikut:
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;
}
Menggunakan g ++ - 4.8.5, kompilasi kode ini memberi saya pesan kesalahan berikut:
~/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>’
Namun, ketika saya kompilasi menggunakan g ++ - 8.3 (dalam, misalnya, ideone) kompilasi kode dan berbagai spesialisasi diperlakukan dengan benar. Apakah ini bug di GCC yang diperbaiki, atau apakah saya entah bagaimana memohon perilaku tidak terdefinisi (dan karena itu perbedaan dalam perilaku kompiler adalah titik diperdebatkan - itu tidak terdefinisi)?