考虑到下面这句话,它说: [dcl.fct]16
包含省略号的声明符或抽象声明符只能在参数声明中使用。[...]。
我同意 包含省略号的声明者ID只能用于参数声明中。因为我们不能使用类似 ...id-expression
的任何地方,它只能出现在参数声明中,所以它是100%的明确。包含省略号的抽象声明符只能用于参数声明中。请考虑以下代码。
#include <iostream>
#include <tuple>
template<typename...T>
void func(T...){
std::tuple<T...> tup; //#1
}
type-id.type-specifier-seq抽象声明者(opt)。
type-specifier-seq abstract-declarator(opt)
怎么样 #1
这不是参数声明,但是,包含省略号的抽象声明符是在 类型标识 所以,我的理解是,在这种情况下,我的理解是 抽象声明者 错了吗?
省略号不属于 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 模板论证 后面的省略号是一个包的扩展。
适用,这是我们所期望的。