考虑以下引用,它说:
[dcl.fct]/16
[dcl.fct]/16
我同意“在声明符中包含省略号只能用于参数声明”,因为我们不能在任何地方使用类似于“...id-expression”的东西,它只能出现在参数声明中,所以这是100%清楚的。然而,关于“抽象声明符中包含省略号只能用于参数声明”,请考虑下面的代码:在声明符或抽象声明符中包含省略号只能用于参数声明。[...]
#include <iostream>
#include <tuple>
template<typename...T>
void func(T...){
std::tuple<T...> tup; //#1
}
类型标识符:
类型说明符序列 抽象声明符(可选)
关于#1,它并不是参数声明,然而在该上下文中包含省略号的抽象声明符被用于类型标识符。那么,我的关于抽象声明符的理解是否有误呢?
void func(T...)
中的省略号是一个抽象声明符
,位于一个参数声明
中。 - MarkT...
和参数列表子句中的T...
之间的区别,我认为它们都是类型标识符。换句话说,元组中的模板参数也是类型,对吗?就像你回答中的语法一样,template-argument: type-id
,T
是类型名称,...
是抽象声明符。这是我的理解。有没有引用可以将它们区分开来? - xmh0511<something>
,而这里的T
只是某种类型,它不是模板名称,我认为。 而且 [temp.param#3] 表示它是一个 typedef 名称,这意味着它必须表示一种类型,相比之下,模板名称不是一种类型。 - xmh0511typename... T
中,这是遵循省略号的情况,因此标识符T
不是 typedef 名称。[[temp.param]/3] 表示“在模板声明的范围内”,因此我认为T...
符合这些规则。这是我的理解,我不能百分之百确定。 - xmh0511