默认参数格式良好后是可变参数吗?

时间:2016-02-25 22:55:05

标签: c++ language-lawyer c++14 variadic-templates

template <typename... Args>
void bark( int = 0, Args&&... args ) {}

int main() {
     bark();
     bark(1);
     bark(1, 2);
}

此代码是否符合C ++标准?

建议的副本不包含与函数相同的调用。

1 个答案:

答案 0 :(得分:14)

由于CWG 777,声明有效:

  

在给定的函数声明中, a之后的所有每个参数   带有默认参数的参数应具有默认参数   在此声明或之前的声明中提供或应为函数   参数包

在所有三种情况下,扣除都应该成功,因为默认参数对扣除的性质没有影响:如果没有提供pack参数args的参数,则通过{{3}推导出空包。 },否则[temp.arg.explicit]/3中的通常规则适用(因为包明显不在非推导的上下文中)。