2017-07-12 11 views
7

Zauważyłem dość dziwne zachowanie z mojej perspektywy: argumenty domyślne funkcji nie mogą być przekazywane w kodzie poniżej.Dlaczego domyślne parametry funkcji nie mogą być przekazywane dalej w C++?

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 donosi: błąd: zbyt mało argumentów w wywołaniu funkcji, oczekuje 1, mają 0 GCC i raportów VC same błędy.

Czy ktoś może to wyjaśnić?

Code jest tutaj: http://rextester.com/live/JOCY22484

+0

Krótszy testowy przypadek: 'auto f = Test; f(); ' – 0x499602D2

Odpowiedz

11

Test to funkcja, która zawsze przyjmuje jeden argument. Jeśli jego deklaracja z domyślnym argumentem jest widoczna po wywołaniu Test przez nazwę, kompilator domyślnie doda domyślny argument do wywołania. Jednak po przekształceniu Test w wskaźnik lub odwołanie do funkcji domyślna informacja o argumencie nie jest już widoczna.

ten można obejść poprzez stworzenie funktor, który naprawdę bierze zero lub jeden argumenty i ma tę informację zakodowaną w swoim rodzaju, więc nie mogą być zniszczone, tak jak poniżej:

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

' void operator() (int = 0) {/ * ... * /} 'będzie działało dobrze. –

Powiązane problemy