use*_*080 5 c++ variadic-templates c++11
有一个明确且易于理解的上下文列表,其中可以在cppreference.com上进行包扩展.我想要做的是从标准中获取相同的信息,部分是为了获得使用标准的经验.但是,我无法从标准中派生出cppreference.com上列出的所有包扩展上下文.
cppreference.com列出了以下四个上下文:函数参数列表,模板参数列表,函数参数列表和模板参数列表.
另一方面,标准说(14.5.3.4):
包扩展由模式和省略号组成,其实例化在列表中产生零个或多个模式的实例化(如下所述).模式的形式取决于扩展发生的环境.包扩展可以在以下上下文中发生:
- 在函数参数包(8.3.5)中; 模式是没有省略号的参数声明.
- 在作为包扩展的模板参数包(14.1)中:
- 如果模板参数包是参数声明; 模式是没有省略号的参数声明;
- 如果模板参数包是带有template-parameter-list的type-parameter; 模式是没有省略号的相应类型参数.
- ...
- 在模板参数列表中(14.3); 模式是模板参数.
- ...
我无法找出标准说哪个包扩展可以在函数参数列表中出现.我想这个背景在某种程度上被上面引用的三个要点中的一个所涵盖.
如果我不清楚函数参数列表中包扩展的含义,请考虑以下示例:
template <typename ...Args> void f(Args ...args) {}
template <typename ...Args> void g(Args ...args) {
f(args...); // Pack expansion in a function argument list.
}
Run Code Online (Sandbox Code Playgroud)
函数参数列表在语法上是初始化列表1,因此它被[temp.variadic] /(4.4)覆盖:
在初始化列表中 ; 该模式是初始化子句.
1.函数调用的语法是postfix-expression ( expression-list opt ).和表达式列表只是一个初始化列表.([expr.post])