c++ - 如何理解“包含省略号的抽象声明符只能用于参数声明”
问题描述
考虑以下引用,它说:
[dcl.fct]/16
包含省略号的 declarator-id 或 abstract-declarator 只能在参数声明中使用。[...]
我同意A declarator-id contains a ellipsis shall only be used in a parameter-declaration,因为我们不能...id-expression
在任何地方使用类似的东西,它只能出现在参数声明中,所以它是 100% 清楚的。但是,关于抽象- 包含省略号的声明符只能在参数声明中使用,请考虑以下代码:
#include <iostream>
#include <tuple>
template<typename...T>
void func(T...){
std::tuple<T...> tup; //#1
}
类型 ID:
类型说明符序列抽象声明符(选择)
怎么样#1
,不是参数声明,但是,包含省略号的抽象声明符在该上下文中的类型标识中使用。那么,我对抽象声明符的理解是否错误?
解决方案
省略号不是 a 的一部分type-id
,而是 a 的一部分template-argument-list
。
如果我们从[temp.names]应用以下语法
简单模板 ID: 模板名称 < 模板参数列表选项> 模板名称: 标识符 模板参数列表: 模板参数...选择 [...] 模板参数: 类型标识 [...]
对于您的示例,我们得到:
std::tuple<T...> tup;
// tuple<T...> simple-template-id
// tuple template-name
// T... template-argument-list
// T template-argument, type-id
然后,[temp.arg]/9
后跟省略号的模板参数是包扩展。
applies, which is what we'd expect.
推荐阅读
- sql - 将 SQL 选择存储为变量并稍后与另一个选择进行比较
- java - PMD 选项在 Spring Tool Suite 3.9.6 中不可见
- android-studio - 没有它,Google 服务插件将无法运行。文件 google-services.json 丢失。
- android - 从活动导航时保留任务的活动堆栈
- python - 当 .py 在 RASPBIAN STRETCH LITE 上作为启动运行时,kivy 上的鼠标光标被隐藏
- javascript - 在 Vue.js 中嵌套循环组件
- python-3.x - 在 Python 中使用 PicoSDK
- c - CMake:对于每个源文件一个可执行文件
- enterprise-architect - Archimate - 应用层 - 接口 + 数据库
- python - 关于切片数组覆盖python中的字典赋值的问题