Następujący kod fails to compile:Czy domyślne argumenty funkcji "wypełnij" dla rozwiniętych paczek parametrów?
#include <iostream>
template<typename F, typename ...Args>
static auto wrap(F func, Args&&... args)
{
return func(std::forward<Args>(args)...);
}
void f1(int, char, double)
{
std::cout << "do nada1\n";
}
void f2(int, char='a', double=0.)
{
std::cout << "do nada2\n";
}
int main()
{
wrap(f1, 1, 'a', 2.);
wrap(f2, 1, 'a');
}
g++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
main.cpp: In instantiation of 'auto wrap(F, Args&& ...) [with F = void(*)(int, char, double); Args = {int, char}]':
main.cpp:22:20: required from here
main.cpp:6:44: error: too few arguments to function
return func(std::forward<Args>(args)...);
Wydaje się, że zasada o „dodatki parametru ostatni” następuje (przynajmniej w zgłoszeniu), a po rozszerzeniu powinna być utworzona prawidłowa wywołanie funkcji: f2
może być wywołany z 1, 2 lub 3 argumentami, więc too few arguments
jest błędem. To także nie wygląda jak deduction problem (co byłoby moim zdaniem - ale się rozchyliłem z powodu komunikatu o błędzie).
Czy to jest brakująca funkcja, czy też z punktu widzenia Standardów jest naruszenie?
To rzuca podobny błąd z brzękiem 3,5 – OmnipotentEntity
VS2013 Daj to: main.cpp (7): C3551 błąd: Oczekiwano wstecznego powrotu typu: – abcthomas