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)
).
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? –
@IgorTandetnik Nie oczekiwałem, że któryś z nich zadziała. –
Prześlij raport o błędzie "akceptuje-nieważny" dla każdego. – Deduplicator