Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么std::void在这种情况下不起作用? #包括 样板 结构IsIterator final:std::false\u类型 {}; 样板 结构迭代器 最终:标准::真实类型 {}; int main() { 返回IsIterator::value; }_C++_Templates_C++17_Sfinae_Typetraits - Fatal编程技术网

C++ 为什么std::void在这种情况下不起作用? #包括 样板 结构IsIterator final:std::false\u类型 {}; 样板 结构迭代器 最终:标准::真实类型 {}; int main() { 返回IsIterator::value; }

C++ 为什么std::void在这种情况下不起作用? #包括 样板 结构IsIterator final:std::false\u类型 {}; 样板 结构迭代器 最终:标准::真实类型 {}; int main() { 返回IsIterator::value; },c++,templates,c++17,sfinae,typetraits,C++,Templates,C++17,Sfinae,Typetraits,clang 8.0给出以下错误消息: #include <type_traits> template<typename, typename = void> struct IsIterator final : std::false_type {}; template<typename T> struct IsIterator<T, std::void_t<std::enable_if_t<std::is_base_of_v<s

clang 8.0给出以下错误消息:

#include <type_traits>

template<typename, typename = void>
struct IsIterator final : std::false_type
{};

template<typename T>
struct IsIterator<T,
    std::void_t<std::enable_if_t<std::is_base_of_v<std::input_iterator_tag,
        typename std::iterator_traits<T>::iterator_category>>>>
    final : std::true_type
{};


int main()
{
    return IsIterator<void*>::value;
}
/usr/bin/./include/c++/v1/iterator:507:16:错误:无法形成对“void”的引用
typedef_Tp&reference;
^
main.cpp:20:23:注意:在模板类“std::\uu 1::iterator\u traits”的实例化中请求
在这里
typename std::iterator_traits::iterator_category>>>>
^
main.cpp:29:16:注意:在类模板部分专门化的模板参数推导过程中
“IsIterator”[带T=void*]
返回IsIterator::value;
^
main.cpp:29:16:注意:在这里请求的模板类“IsIterator”的实例化中
为什么
std::void\u t
在这种情况下不起作用?
std::iterator\u traits::iterator\u category
强制实例化
std::iterator\u traits


您必须手动处理
void*

注意
std::void\u t
与已返回
void
std::enable\u是冗余的。
/usr/bin/../include/c++/v1/iterator:507:16: error: cannot form a reference to 'void'
    typedef _Tp& reference;
               ^
main.cpp:20:23: note: in instantiation of template class 'std::__1::iterator_traits<void *>' requested
      here
        typename std::iterator_traits<T>::iterator_category>>>>
                      ^
main.cpp:29:16: note: during template argument deduction for class template partial specialization
      'IsIterator<T, std::void_t<std::enable_if_t<std::is_base_of_v<std::input_iterator_tag, typename
      std::iterator_traits<T>::iterator_category> > > >' [with T = void *]
        return IsIterator<void*>::value;
               ^
main.cpp:29:16: note: in instantiation of template class 'IsIterator<void *, void>' requested here