Je ne comprends pas quel est le problème: soit dans mon code, soit dans le compilateur (moins possible). Il y a un morceau de code comme celui-ci:
#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 et MSVC le compilent. Je l'ai testé sur godbolt avec différentes versions de GCC et MSVC 17 (local) et 19. Voici un lien: https://godbolt.org/z/Enfm6L .
Mais Clang ne le compile pas et émet une erreur:
redefinition of `'TestA<T, std::void_t<typename T::dummy_iterator> >'`
Et je suis intéressé - peut-être qu'il y a une partie de la norme où ce morceau de code est incorrect ou peut-être autre chose.