C++ 叮当声不响';我不编译代码,但gcc和msvc编译了它

C++ 叮当声不响';我不编译代码,但gcc和msvc编译了它,c++,templates,gcc,visual-c++,clang,C++,Templates,Gcc,Visual C++,Clang,我不明白问题出在哪里:要么在我的代码中,要么在编译器中(不太可能)。有一段代码如下: #include <iostream> #include <type_traits> #include <set> template<typename T, typename = void> struct TestA: std::false_type {}; template<typename T> struct TestA<T, std:

我不明白问题出在哪里:要么在我的代码中,要么在编译器中(不太可能)。有一段代码如下:

#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;
}
#包括
#包括
#包括
模板
struct TestA:std::false_type{};
模板
struct TestA:std::true_type{};
模板
struct TestA:std::true_type{};
int main()
{

std::cout这很可能与疾病有关

别名模板专门化中未使用参数的处理 未由17.6.7[临时别名]的当前措辞指定。对于 例如:

  #include <iostream>

  template <class T, class...>
    using first_of = T;

  template <class T>
    first_of<void, typename T::type> f(int)
      { std::cout << "1\n"; }

  template <class T>
    void f(...)
      { std::cout << "2\n"; }

  struct X { typedef void type; };

  int main() {
    f<X>(0);
    f<int>(0);
  }

对于类模板(别名现在所代表的),定义了替换失败。将其插入示例中可以消除Clang。

Clang标头中如何定义“std::set::reverse_iterator”和“std::set::dummy_iterator”?Clang标头中根本没有定义std::set::dummy_iterator(我希望如此)。你可以将dummy_迭代器更改为任何你想要的,它不会更改结果,因为问题不在下面的定义中。谢谢你,Andrei,我读了答案,这很有趣。另一个解决方法是为每个需求创建特征,然后将它们组合在一个
启用_if
std::disconction(或requires子句)感谢您的帮助和参考!很遗憾听到这种叮当声中的错误。有趣的是,我认为您的void\u t实现是标准的。不能采用模板别名的想法。
template <typename...> struct voider { using type = void; };
template <typename... T> using my_void_t = typename voider<T...>::type;