2017-05-08 18 views
5

有一个清晰和易于理解的上下文列表,其中数据包扩展可以在cppreference.com上发生。我试图做的是从标准中获得相同的信息,部分是为了获得使用标准的经验。但是,我无法从标准中获取cppreference.com上列出的所有包扩展上下文。可能发生数据包扩展的上下文

cppreference.com列出了以下四个上下文:函数参数列表,模板参数列表,函数参数列表和模板参数列表。

在另一方面,标准说(14.5.3.4):

一包扩展由一个图案和省略号,实例化,其中产生所述图案的零个或多个实例在一个列表中的(如下面所描述的)。模式的形式取决于扩展发生的环境。在以下情况下可能出现包扩展:

  • 在函数参数包(8.3.5);该模式是没有省略号的参数声明。
  • 在模板参数组是一包扩展(14.1):
    • 如果模板参数包是一个参数声明;该模式是没有省略号的参数声明;
    • 如果模板参数包是带有模板参数列表的类型参数;该模式是没有省略号的相应类型参数。
  • ...
  • 在模板参数列表(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. 
} 
+0

你是指当一个函数被调用?例如。 'f(some_pack ...)' –

+0

@VittorioRomeo正确地,请参阅问题中提到的[cppreference.com页面](http://en.cppreference.com/w/cpp/language/parameter_pack)。我正在讨论“函数参数列表”标题下的例子。 – user1494080

+0

可能的完整解释在这里http://en.cppreference.com/w/cpp/language/parameter_pack请参阅“扩展基因座” –

回答

5

函数的参数列表是语法上的初始化列表 ,使它的覆盖[temp.variadic]/(4.4)

初始化列表;该模式是初始化子句


1.一个函数调用的语法是后缀表达式表达式列表选择。而一个表达式列表只是一个初始化列表。 ([expr.post]