2015-01-28 19 views
10

Il seguente codice fails to compile:Gli argomenti delle funzioni predefiniti possono "riempire" per i pacchetti di parametri espansi?

#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)...); 

Sembra che la regola di "parametri confezioni essere l'ultimo" è seguita (almeno nella dichiarazione) e dopo l'espansione deve essere formata una chiamata di funzione corretta: f2 può essere chiamato con 1, 2 o 3 argomenti, pertanto l'errore too few arguments sembra "difficile". Inoltre non assomiglia a un deduction problem (che sarebbe la mia ipotesi - ma è tremante a causa del messaggio di errore)

Questa è una caratteristica mancante o c'è una violazione dal punto di vista dello Standard?

+0

Si genera un errore simile con clangore 3,5 – OmnipotentEntity

+0

VS2013 dare a questo: main.cpp (7): l'errore C3551: previsto un tipo di ritorno finale – abcthomas

risposta

10

Non si sta chiamando una funzione con argomenti predefiniti dal modello.

Si sta chiamando un puntatore a funzione, che punta a una funzione che prevede esattamente 3 argomenti, né più né meno.

Ovviamente il compilatore si lamenta amaramente del terzo mancante.

Si potrebbe fare ciò che si sta cercando di fare lì con un funtore variadic, 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

.. e ora '' 'in' void (*) (int, char, double) 'viene improvvisamente scritto con un [26 appassionato] (https://www.youtube.com/watch?v=qrdpliMfoAM) –

Problemi correlati