c++ SFINAE - 检查 class 有 typedef,为什么需要 void_t?

c++ SFINAE - checking class has typedef, why is void_t required?

template <class T> struct has_iterator_typedefs
{
private:
    struct __two {char dummy[2];};
    template <class U> static __two test( ... );
    template <class U> static char  test( typename __void_t<typename U::iterator_category>::type*    = NULL,    //NOTE: require __void_t , == NULL ?
                                          typename __void_t<typename U::difference_type>::type*      = NULL,
                                          typename __void_t<typename U::value_type>::type*           = NULL,
                                          typename __void_t<typename U::reference>::type*            = NULL,
                                          typename __void_t<typename U::pointer>::type*              = NULL);
public:
    static const bool value = sizeof(test<T>(0,0,0,0,0)) == 1;
};

这是 libc++ 代码的一部分。 我了解 void_t 是如何工作的,但我不知道为什么在上下文中需要它。

为什么 SFINAE 在没有 void_t 的情况下无法工作,例如 typename U::iterator_category*

+) 我认为它确实有效 w/o 默认参数 = NULL,它是必需的吗?

你不能有指向引用的指针

using X = int&;
using T = X*; // fail

所以至少 U::reference* 很可能会失败。


我不认为 NULL 真的有必要,因为调用者确实提供了所有的值。


注意:我假设 __void_tstd::void_t

相同