2015-01-18 30 views
9

Poniższe kompiluje w brzękiem ale nie w gcc:Niejednoznaczne wywołanie funkcji z dwoma parametru pakuje

template <class... Ts, class... Args> 
void f(Ts&&..., Args&&...); 

int main() 
{ 
    f(); 
} 

Jest to błąd pojawia się w GCC:

main.cpp: In function 'int main()': 
main.cpp:30:7: error: no matching function for call to 'f()' 
    f(); 
    ^
main.cpp:30:7: note: candidate is: 
main.cpp:23:6: note: template<class ... Ts, class ... Args> void f(Ts&& ..., Args&& ...) 
void f(Ts&&..., Args&&...) 
    ^
main.cpp:23:6: note: template argument deduction/substitution failed: 
main.cpp:30:7: note: candidate expects 1 argument, 0 provided 
    f(); 
    ^

Jeśli dam argument jak f(0) następnie kompiluje się z GCC, ale nie z Clangiem.

Błąd z brzękiem:

main.cpp:30:5: error: no matching function for call to 'f' 
    f(0); 
    ^
main.cpp:23:6: note: candidate function not viable: requires 0 arguments, but 1 was provided 
void f(Ts&&..., Args&&...) 
    ^
1 error generated. 

Jeśli daję taką samą liczbę wyraźnych argumentów szablonu jako parametry funkcji następnie kompiluje z obu kompilatorów (tj f<int, int, int>(0, 0, 0)).

+8

Nie widzę, jak to ma działać. Jeśli nazwiesz 'f (1, 2, 3, 4)' lub nawet 'f (1, 2, 3, 4)' - które są 'Ts' i które są' Args' ? W jaki sposób kompilator może określić, gdzie kończy się poprzedni i drugi? Czy to dwa i dwa, jeden i trzy, zero i cztery? –

+2

@IgorTandetnik Nie oczekiwałem, że któryś z nich zadziała. –

+5

Prześlij raport o błędzie "akceptuje-nieważny" dla każdego. – Deduplicator

Odpowiedz

2

Drugi szablon parametrów pakietu Args rzeczywiście wywnioskować:

Opakowanie wzdłużny parametry szablonu (14.5.3), w przeciwnym razie nie zostanie wyprowadzona wywnioskować do pustej sekwencji argumentów szablonów.

Biorąc to pod uwagę, staje się jasne, że np. f<int>(0) jest dobrze uformowany. Jednakże, Ts nigdy nie jest wydedukowana. [Temp.deduct.call]/1:

Po pojawieniu się pakietu parametr funkcji w nie wynikają kontekście (14.8.2.5) rodzaj tego opakowania parametru jest nie wynikają.

Należy pamiętać, że poprzednia oferta nie dotyczy Ts, ponieważ nie jest ona końcowa. Dlatego czysta dedukcja zawsze zawodzi.

Powiązane problemy