พิจารณารหัสต่อไปนี้:
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 ที่ได้รับการแก้ไขหรือฉันกำลังเรียกใช้พฤติกรรมที่ไม่ได้กำหนดอย่างใดอย่างหนึ่ง (และดังนั้นความแตกต่างในพฤติกรรมของคอมไพเลอร์คือจุดที่สงสัย - มันไม่ได้กำหนด)?