函数参数包的行为

Behavior of a function parameter pack

本文关键字:参数 函数      更新时间:2023-10-16
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;

但这不起作用,并引发编译器错误。所以我可以假设它没有得到自己的类型。有人会"沉默"这里到底发生了什么,以及函数参数包的行为吗?

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

当省略号位于模式的右侧时,将进行参数扩展。我们这里的模式只是T:

foo(T... args);

标准规定,这样做的结果将是parameter-declaration。这衰减为:

属性说明符seqoptdecl说明符seq声明符

CCD_ 6可以忽略。

decl-specifier-seq是类型,T

declarator... args

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

再一次,我的好奇心让我有点疯狂。。。呵呵。