Nie rozumiem, na czym polega problem: ani w moim kodzie, ani w kompilatorze (mniej możliwe). Jest taki kod:
#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;
}
Kompilują go zarówno GCC, jak i MSVC. Przetestowałem go na Godbolt z inną wersją GCC i MSVC 17 (lokalna) i 19. Oto link: https://godbolt.org/z/Enfm6L .
Ale Clang go nie kompiluje i emituje błąd:
redefinition of `'TestA<T, std::void_t<typename T::dummy_iterator> >'`
I jestem zainteresowany - może jest jakaś część standardu, w której ten fragment kodu jest niepoprawny, a może coś innego.