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

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

Czy ten kod jest dobrze sformułowany zgodnie ze standardem C++?Czy argumenty zmienne po poprawnie skonfigurowanym parametrze domyślnym?

Proponowany duplikat nie zawiera tych samych wywołań funkcji.

+1

Nie duplikat: http://stackoverflow.com/questions/29098835/can-parameter-pack-function-arguments-be-defaulted, nie zawiera wywołań tego samego formularza. – Puppy

+0

Wygląda jak duplikat dla mnie. Nawet jeśli inwokacja nie jest identyczna, odpowiedź w tym pytaniu pokazuje dwie części normy, które mówią, że nie są one ważne nawet w tym przypadku. –

+1

Kwestia poruszona w tym pytaniu została poprawiona w Clang, ale Clang wciąż odrzuca ten kod. – Puppy

Odpowiedz

14

Ze względu na CWG 777, deklaracja jest ważna:

W danej deklaracji funkcji, wszystkie każdym następnym do parametru z domyślnym argumentem parametry mają domyślny argumenty dostarczane w ten lub wcześniejsze deklaracje lub będą funkcją paczki parametrów.

Odliczenie powinno odnieść sukces we wszystkich trzech przypadkach, ponieważ domyślnym argumentem nie ma wpływu na charakter odliczenia: Jeśli żaden argument parametru opakowanie args jest, to wywnioskować z pustym opakowaniu poprzez [temp.arg.explicit]/3, inaczej zwykły zasada obowiązuje w [temp.deduct.call]/1 (ponieważ pakiet wyraźnie nie znajduje się w niezorientowanym kontekście).

Powiązane problemy