如何理解 "包含省略号的抽象声明符只能在参数声明中使用"

问题描述 投票:1回答:1

考虑到下面这句话,它说: [dcl.fct]16

包含省略号的声明符或抽象声明符只能在参数声明中使用。[...]。

我同意 包含省略号的声明者ID只能用于参数声明中。因为我们不能使用类似 ...id-expression 的任何地方,它只能出现在参数声明中,所以它是100%的明确。包含省略号的抽象声明符只能用于参数声明中。请考虑以下代码。

#include <iostream>
#include <tuple>
template<typename...T>
void func(T...){
  std::tuple<T...> tup;  //#1
}

[dcl.name]

type-id.type-specifier-seq抽象声明者(opt)。

type-specifier-seq abstract-declarator(opt)

怎么样 #1这不是参数声明,但是,包含省略号的抽象声明符是在 类型标识 所以,我的理解是,在这种情况下,我的理解是 抽象声明者 错了吗?

c++ language-lawyer
1个回答
5
投票

省略号不属于 type-id但是 template-argument-list.

如果我们应用以下语法,从 [temp.names]

simple-template-id: template-name < template-argument-list选择 >模板名称:identifierertemplate-argument-list:模板-argument ...选择    [...]模板参数:type-id [...]

到你的例子,我们得到。

   std::tuple<T...> tup;
//      tuple<T...>       simple-template-id
//      tuple             template-name
//            T...        template-argument-list
//            T           template-argument, type-id

Then, [temp.arg]9

A 模板论证 后面的省略号是一个包的扩展。

适用,这是我们所期望的。

© www.soinside.com 2019 - 2024. All rights reserved.