首页 > 解决方案 > 如何理解“包含省略号的抽象声明符只能用于参数声明”

问题描述

考虑以下引用,它说:
[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
}

[dcl.name]

类型 ID:

类型说明符序列抽象声明符(选择)

怎么样#1,不是参数声明,但是,包含省略号的抽象声明符在该上下文中的类型标识中使用。那么,我对抽象声明符的理解是否错误?

标签: c++language-lawyer

解决方案


省略号不是 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.


推荐阅读