gpt4 book ai didi

c++ - 为什么 std::void_t 在这种情况下不起作用?

转载 作者:行者123 更新时间:2023-11-28 04:13:15 27 4
gpt4 key购买 nike

#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;
}

clang 8.0 给出以下错误消息:

/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

为什么 std::void_t 在这种情况下不起作用?

最佳答案

std::iterator_traits<T>::iterator_category强制实例化 std::iterator_traits<T> void* 的格式错误(SFINAE 的硬错误而非软错误) .

你必须处理 void*手动。

关于c++ - 为什么 std::void_t 在这种情况下不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57229389/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com