Я не понимаю, в чем проблема: ни в моем коде, ни в компиляторе (менее возможно). Существует фрагмент кода, подобный следующему:
#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;
}
И G CC, и MSV C компилируют его. Я тестировал его на Godbolt с другой версией G CC и MSV C 17 (локальный) и 19. Вот ссылка: https://godbolt.org/z/Enfm6L.
Но Clang не делает t скомпилирует его и выдаст ошибку:
redefinition of `'TestA<T, std::void_t<typename T::dummy_iterator> >'`
И мне интересно - может быть, есть какая-то часть стандарта, где этот фрагмент кода неверен, или может быть что-то еще.