Я не розумію, в чому проблема: ні в моєму коді, ні в компіляторі (менш можливо). Існує такий фрагмент коду:
#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> >'`
І мені цікаво - можливо, є якась частина стандарту, де цей фрагмент коду невірний, чи, можливо, щось інше.