मुझे समझ नहीं आ रहा है कि समस्या क्या है: या तो मेरे कोड में या संकलक में (कम संभव)। इस तरह का एक कोड है:
#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 दोनों इसे संकलित करते हैं। मैंने इसे GCC और MSVC 17 (स्थानीय) और 19 के विभिन्न संस्करण के साथ गॉडबोल्ट पर परीक्षण किया। यहां एक लिंक दिया गया है: https://godbolt.org/z/Enfm6L ।
लेकिन क्लैंग इसे संकलित नहीं करता है और एक त्रुटि का उत्सर्जन करता है:
redefinition of `'TestA<T, std::void_t<typename T::dummy_iterator> >'`
और मुझे दिलचस्पी है - शायद मानक का कुछ हिस्सा है जहां यह कोड गलत है या शायद कुछ और है।