我正在查看SFINAE文档,其中有这个模板声明:
template<typename SomeType>
struct inner_type { typedef typename SomeType::type type; };
template <
class T,
class = typename T::type, // SFINAE failure if T has no member type
class U = typename inner_type<T>::type // hard error if T has no member type
// (guaranteed to not occur as of C++14)
> void foo(int) {}
具体来说,我想问的是 class = typename T::type
的意义是什么?为什么要声明一个匿名类?
根据评论,我认为当 T
没有成员 type
时,这将导致编译错误,但事实并非如此,因为 foo<int, int, int>(0);
可以成功编译。
另一方面
template<class T, typename = std::enable_if_t<std::is_unsigned<T>::value>>
void foo(T t) {}
如果
T
是有符号的,它将无法编译;如果 T
是无符号的,则可以编译通过。这里我错过了什么?
foo
作为foo<int>(0)
调用,而不是覆盖模板参数以移除模板重载替换。 - phantom