2016-02-25 44 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適用(因爲該包顯然不在未推導的上下文中)。