Non capisco qual è il problema: né nel mio codice né nel compilatore (meno possibile). C'è un pezzo di codice come questo:
#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;
}
Sia GCC che MSVC lo compilano. L'ho provato su godbolt con diverse versioni di GCC e MSVC 17 (locale) e 19. Ecco un link: https://godbolt.org/z/Enfm6L .
Ma Clang non lo compila ed emette un errore:
redefinition of `'TestA<T, std::void_t<typename T::dummy_iterator> >'`
E sono interessato - forse c'è qualche parte dello standard in cui questo pezzo di codice è errato o forse qualcos'altro.