2015-01-28 18 views
10

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?

+0

To rzuca podobny błąd z brzękiem 3,5 – OmnipotentEntity

+0

VS2013 Daj to: main.cpp (7): C3551 błąd: Oczekiwano wstecznego powrotu typu: – abcthomas

Odpowiedz

10

Nie wywołujesz funkcji z domyślnymi argumentami z szablonu.

Wywołujesz funkcję-wskaźnik, która wskazuje na funkcję, która oczekuje dokładnie 3 argumentów, ani więcej, ani mniej.

Oczywiście kompilator skarży się gorzko na brakującą trzecią.

Można robić, co chce zrobić tam o zmiennej liczbie argumentów funktora, since C++14 even a lambda:

wrap([](auto&&... args){return f2(std::forward<decltype(args)>(args)...);}, 1, 'a'); 
+1

'return f2 (std :: forward (args) ...);' –

+1

.. a teraz '*' in 'void (*) (int, char, double) 'jest nagle napisane za pomocą [26 fond] (https://www.youtube.com/watch?v=qrdpliMfoAM) –

Powiązane problemy