函数参数包的行为

时间:2016-08-04 09:17:34

标签: c++ function templates variadic-templates

template<typename... T>
void foo(T... args);

在上面的示例中,T根据标准的§14.5.3 - (4.1)进行了扩展。

  

§14.5.3 - (4.1) - 在函数参数包(8.3.5)中;模式是没有省略号的参数声明。

这到底发生了什么?假设我用3个整数调用函数。

foo(1, 2, 3);

参数包是否像

一样展开
foo(int arg1, int arg2, int arg3);

其中arg1,arg2和arg3只是编译器给出的任意名称?

标准说“模式是如何没有省略号的参数声明”

我解释的另一种方式是args得到一个参数 - 声明。是args获得自己的类型?我试过了

std::cout << typeid(args).name;

但这不起作用,并抛出编译器错误。所以我可以假设它没有自己的类型。有人会“愚蠢地”发现这里发生的事情,以及函数参数包的行为吗?

1 个答案:

答案 0 :(得分:0)

好吧,我想我已经明白了。如果我错了,请纠正我。

当省略号位于模式的右侧时,会发生参数扩展。我们的模式只是T

foo(T... args);

标准规定其结果为parameter-declaration。这衰败成:

  

attribute-specifier-seq opt decl-specifier-seq declarator

attribute-specifier-seq可以忽略。

decl-specifier-seq是类型T;

declarator... args

从语义上讲,这是一个函数参数包声明。没什么特别的。

再一次,我的好奇心使我疯了一点......嘿。