[英]Why does std::void_t not work in such a case?
#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*
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.