为什么不需要在 C++20 中的依赖类型之前指定"typename"?
Why don't I need to specify "typename" before a dependent type in C++20?
这段代码在 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 中用作声明说明符的限定名称:
命名空间范围内的简单声明或函数定义
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 为什么返回类型中需要typename?C++
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- 为什么不需要在 C++20 中的依赖类型之前指定"typename"?
- 为什么在以下情况下不需要为依赖类型使用typename
- 如果函数是在类的主体中定义的,我是否需要在成员函数的返回类型中指定 typename?
- 为什么在VS2015中模板相关的嵌套类型名称中不需要typename关键字?
- 为什么嵌套类型的基类不需要"typename"?
- 什么时候可以将"typename"与明确引用类型的标识符一起使用?
- 模板<类型名...>与模板不匹配<typename>是缺陷吗?
- 为什么模板<类型名...>不能通过模板<模板类型名>识别为可实例化<typename>?
- 为什么对于依赖类型,单词 'typedef' 后面需要'typename'?
- 在越界成员定义的类型说明符中是否可以省略typename
- 使用 xerces 读取 XML:获取类型,其中 <nodeName type= "typeName" >
- 第二个指定的类型在模板typename声明中意味着什么
- "typename qualified-id"引用非类型参数声明中的类型
- 模板typename为同一模板的其他参数的类型
- 强制无符号类型到c++模板typename中
- 对于类型修改特征,我是否应该为 typename::transform<...>::type 提供一个模板 typedef(又名使用)方便包装器?