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;
但这不起作用,并抛出编译器错误。所以我可以假设它没有自己的类型。有人会“愚蠢地”发现这里发生的事情,以及函数参数包的行为吗?
答案 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
从语义上讲,这是一个函数参数包声明。没什么特别的。
再一次,我的好奇心使我疯了一点......嘿。