在模板参数中的未命名类/类型名称

4

我正在查看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 是无符号的,则可以编译通过。
这里我错过了什么?

2
看起来你只应该将 foo 作为 foo<int>(0) 调用,而不是覆盖模板参数以移除模板重载替换。 - phantom
1个回答

4

foo<int, int, int>(0); 可以编译通过。

由于您指定了第二个模板参数,因此默认的模板参数(即 typename T::type)将不会被使用,进而也不会触发编译错误。

如果您只写 foo<int>(0); 以使默认的模板参数被使用,编译将失败。

点此查看实例

对于您的第二个示例也是同样的情况。

未命名类的声明有什么意义?

这是因为该模板参数不会在模板实现中被使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接