为什么嵌套类型的基类不需要"typename"?

Why isn't `typename` required for a base class that is a nested type?

本文关键字:typename 不需要 基类 嵌套类型 为什么      更新时间:2023-10-16

我很惊讶地看到,当依赖类型显示为基类时,没有必要添加typename

struct B {};
struct wr
{ typedef B type; };
template<class T>
struct A : T::type
{};
int main()
{
A<wr> a;
(void)a;
}

为什么typename不需要在T::type面前?

为什么T::type前面不需要typename

因为不能从值继承。你使用typename告诉编译器给定的嵌套标识符是一种类型,但对于继承,无论如何都必须如此,所以你可以省略它 - 这就是为什么该语言为基本说明符提供了typename规则的例外。来自 cpp偏好(强调我的(:

从属名称的typename消除歧义器

在模板的声明或定义(包括别名模板(中,不是当前实例化的成员且依赖于模板参数的名称不被视为类型,除非使用关键字 typename 或除非它已建立为类型名称,例如,使用 typedef 声明或用于命名基类。

请注意,我们将获得更多可以省略typename的地方,请参阅 P0634。

正如其他人指出的那样,这是一个特例。引用这方面的标准:

[温度]

5 在类或 decltype 中用作名称的限定名,或 精心设计的类型说明符被隐式假定为命名类型, 不使用 typename 关键字。在嵌套名称说明符中 它立即包含一个嵌套名称说明符,该说明符依赖于 模板参数,标识符或简单模板 ID 是隐式的 假定命名类型,而不使用 typename 关键字。 [ 注意:这些语法不允许使用typename关键字 构建。 — 尾注 ]

到了 C++20 年,需要typename会有更多的例外.

只有当你需要告诉编译器需要一种类型而不是其他东西时,你才需要使用typename

由于只能从类型继承,因此没有歧义,因此typename是多余的。