C++ 变量模板:候选人需要1个参数,提供0(扣除错误)
看看这个代码片段C++ 变量模板:候选人需要1个参数,提供0(扣除错误),c++,templates,metaprogramming,variadic-templates,template-function,C++,Templates,Metaprogramming,Variadic Templates,Template Function,看看这个代码片段 template<class T> void print(T var) { std::cout << var << " "; } template<class... Args> void Variadic(Args... args) { print(args...); } int main() { Variadic(); } 它试图调用print()…哦,等等,参数包为空,
template<class T>
void print(T var)
{
std::cout << var << " ";
}
template<class... Args>
void Variadic(Args... args)
{
print(args...);
}
int main()
{
Variadic();
}
它试图调用print()…哦,等等,参数包为空,print()函数接受1个参数
为什么它的计算结果是autox={0}代码>,那么
为什么编译器没有给出与以前完全相同的错误?您误解了…
扩展运算符的工作原理。在您的示例中,当args
是一个空包时,(print(args),0)
将扩展为零,而不是print()
如果args
被指定为x
,它将扩展到print(x),0
如果args
被指定为x,y
,它将扩展到(打印(x),0),(打印(y),0)
等等
基本上,它扩展了包含args
的所有表达式,并应用于args
位本身
从标准[温度可变]:
包扩展包括一个模式和一个省略号
其实例化将产生0个或多个
列表中的模式。模式的形式取决于上下文
发生膨胀的地方
包扩展的实例化既不是大小也不是。。。表达式或折叠表达式生成列表E1、E2、…、EN,
其中,N是块扩展参数中的元素数。
每个Ei都是通过实例化模式并替换每个Ei生成的
打包扩展参数及其第i个元素
根据C++标准的145.3/P4变量模板[TEMP.VALIDA](<强>强调矿山< /强>):
包扩展包括一个模式和一个省略号,
其实例化会产生零个或多个
列表中的模式(如下所述)。图案的形式取决于
在展开发生的上下文中
注意零或更多。在您的例子中,有一个空包,因此模式(print(args),0)…
的实例化为零。因此,不会出现编译时错误,因为表达式:
auto x = {0, (print(args), 0)...};
实际评估为:
auto x = {0};
也就是说,print
从不在编译器生成的代码中调用。因此,如果我理解正确,因为参数包是空的,我的(print(args),0)…
计算结果为空?所以我最终得到了autox={0}
(您看到的零是我第一次按下的零)我认为它的计算结果不是autox={0,0}代码>我认为它变成了autox={0}代码>由于参数包为空演示>>
auto x = {0, (print(args), 0)...};
auto x = {0};