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

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

Bu kod C++ Standardına göre iyi biçimlendirilmiş mi?Varsayılan bir parametre iyi oluşturulduktan sonra varyantik argümanlar mı?

Önerilen yinelenen, aynı işlev çağrılarını içermiyor.

+1

Yinelenen: http://stackoverflow.com/questions/29098835/can-parameter-pack-function-arguments-be-defaulted, aynı formda çağrı içermiyor. – Puppy

+0

Bana bir kopyası gibi görünüyor. Çağırma aynı olmasa bile, bu sorudaki cevap, bu durumda bile geçerli olmadığını söyleyen standartın iki parçasını gösterir. –

+1

Bu soruda ortaya çıkan sorun Clang içinde düzeltildi, ancak Clang bu kodu hala reddediyor. – Puppy

cevap

14

nedeniyle CWG 777 için, beyan geçerlidir:

Verilen fonksiyon bildiride

, varsayılan bir argüman ile parametreye müteakip tüm her parametreler varsayılan argümanlar sahip olacaktır bu veya verilen Önceki bildirimler veya parametre paketi. Varsayılan argüman kesinti doğaya hiç farketmez çünkü

Kesintisi, her üç durumda da başarılı olmalıdır: pack parametresi args hiçbir argüman sağlanırsa, boş pakete çıkarılabilir oluyor [temp.arg.explicit]/3 aracılığıyla, aksi zamanki [temp.deduct.call]/1 kuralı geçerlidir (paket açık bir şekilde çıkarılmayan bir bağlamda olmadığı için).