为什么不需要在 C++20 中的依赖类型之前指定"typename"?

Why don't I need to specify "typename" before a dependent type in C++20?

本文关键字:typename 类型 不需要 C++20 依赖 为什么      更新时间:2023-10-16

这段代码在 C++20 中编译(使用 gcc 10.1(,在依赖类型std::vector<T>::iterator之前不使用typename关键字。为什么要编译?

#include <vector>
template<typename T>
std::vector<T>::iterator // Why does this not require "typename" before it?
f() { return {}; }
int main() {
auto fptr = &f<int>;
}

代码游乐场

C++20 中的新功能之一是 Down withtypename

在 C++17 中,您必须在几乎所有依赖上下文中提供typename关键字以消除类型与值的歧义。但在C++20,这条规则放宽了很多。在需要类型的所有上下文中,typename关键字不再是必需的。

一个这样的上下文是类作用域中函数的返回类型,如您的示例所示。其他包括成员声明中的类型、using 声明右侧的类型、lambda 的参数声明、要传递给static_cast的类型等。有关完整列表,请参阅论文。


几乎所有原因都是因为基本说明符和 mem 初始化程序 id 总是被排除在外,如下所示:

template <typename T> struct X : T::type  { }; // always ok

这没关系,因为,嗯,这需要是一种类型。本文只是简单地将这个逻辑(好吧,它必须是一种类型,所以让我们假设它是一种类型(扩展到更多必须成为类型的地方。

从引用中,从 c++20 开始,在依赖名称明确为类型名的上下文中,不再需要typename关键字。特别:

在以下(顶级(decl-specifier-seq 中用作声明说明符的限定名称:

命名空间范围内的简单声明或函数定义