template <typename... Args>
void bark( int = 0, Args&&... args ) {}
int main() {
bark();
bark(1);
bark(1, 2);
}
此代码是否符合C ++标准?
建议的副本不包含与函数相同的调用。
答案 0 :(得分:14)
由于CWG 777,声明有效:
在给定的函数声明中, a之后的所有每个参数 带有默认参数的参数应具有默认参数 在此声明或之前的声明中提供或应为函数 参数包。
在所有三种情况下,扣除都应该成功,因为默认参数对扣除的性质没有影响:如果没有提供pack参数args
的参数,则通过{{3}推导出空包。 },否则[temp.arg.explicit]/3中的通常规则适用(因为包明显不在非推导的上下文中)。