2016-02-25 42 views
15
template <typename... Args> 
void bark(int = 0, Args&&... args) {} 

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

此代码是否符合C++标准?默认参数格式良好后的可变参数?

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

+1

不是重复:http://stackoverflow.com/questions/29098835/can-parameter-pack-function-arguments-be-defaulted,不包含相同形式的调用。 – Puppy

+0

看起来像是重复给我。即使调用不相同,该问题的答案也显示了标准的两个部分,即使在这种情况下也是无效的。 –

+1

在这个问题中提出的问题已在Clang中得到解决,但Clang仍然拒绝此代码。 – Puppy

回答

14

由于CWG 777,该声明是有效的:

在一个给定函数声明,所有的 参数与默认参数之后的每个参数应该有一个默认参数 在这个或提供先前的声明或应为功能 参数包。通过[temp.arg.explicit]/3如果没有提供参数包参数args,它的推导为空包,否则平常:

扣除应在所有三种情况下取​​得成功,因为默认参数使得以扣减的性质没有什么区别规则[temp.deduct.call]/1适用(因为该包显然不在未推导的上下文中)。