2017-07-12 7 views
7

Ich fand ziemlich seltsames Verhalten aus meiner Sicht: Funktion Standardargumente können nicht im Code unten weitergeleitet werden.Warum Funktion Standardparameter können nicht perferct in C++ weitergeleitet werden?

void Test(int test = int{}) {} 

template<typename F, typename ...Args> 
void Foo(F&& f, Args&&... args) 
{ 
    std::forward<F>(f)(std::forward<Args>(args)...); 
} 

int main() 
{ 
    Foo(Test, 0); // This compiles 
    Foo(Test); // This doesn't compile 
} 

Clang berichtet: Fehler: Zu wenig Argumente Funktionsaufruf erwartet 1, haben 0 GCC und VC-Bericht gleiche Fehler.

Kann jemand es erklären?

-Code ist hier: http://rextester.com/live/JOCY22484

+0

Kürzere Testfall: 'auto f = Test; f(); ' – 0x499602D2

Antwort

11

Test eine Funktion, die immer ein Argument. Wenn seine Deklaration mit dem Standardargument sichtbar ist, wenn Test mit Name aufgerufen wird, fügt der Compiler implizit dem Argument das Standardargument hinzu. Sobald Test jedoch in einen Zeiger oder Verweis auf eine Funktion konvertiert wurde, ist die Standardargument-Information nicht mehr sichtbar.

Dies kann umgangen werden, indem ein Funktor zu schaffen, die wirklich Argumente dauert Null oder Eins und hat diese Informationen in seiner Art codiert, so dass es nicht zerstört werden kann, etwa so:

struct Test { 
    void operator()(int) { /* ... */ } 
    void operator()() { operator(int{}); } 
} test; 
// ... 
Foo(test, 0); // ok 
Foo(test); // ok 
+4

' void operator() (int = 0) {/ * ... * /} 'wird gut funktionieren. –

Verwandte Themen