ฉันไม่เข้าใจว่ามีปัญหาอะไร: ในโค้ดของฉันหรือในคอมไพเลอร์ (น้อยกว่านั้นเป็นไปได้) มีชิ้นส่วนของรหัสเช่นนี้:
#include <iostream>
#include <type_traits>
#include <set>
template<typename T, typename = void>
struct TestA: std::false_type {};
template<typename T>
struct TestA<T, std::void_t<typename T::reverse_iterator>> : std::true_type {};
template<typename T>
struct TestA<T, std::void_t<typename T::dummy_iterator>> : std::true_type {};
int main()
{
std::cout << TestA<std::set<int>>::value;
}
ทั้ง GCC และ MSVC รวบรวมมัน ผมทดสอบบน godbolt กับรุ่นที่แตกต่างกันของ GCC และ MSVC 17 (ท้องถิ่น) และ 19. นี่คือลิงค์: https://godbolt.org/z/Enfm6L
แต่เสียงดังกราวไม่ได้รวบรวมและส่งข้อผิดพลาด:
redefinition of `'TestA<T, std::void_t<typename T::dummy_iterator> >'`
และฉันสนใจ - อาจมีมาตรฐานบางส่วนที่โค้ดนี้ไม่ถูกต้องหรืออาจเป็นอย่างอื่น