Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 变量模板:候选人需要1个参数,提供0(扣除错误)_C++_Templates_Metaprogramming_Variadic Templates_Template Function - Fatal编程技术网

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};