2014-12-02 34 views
9

Oto moje pytanie: I zdefiniować funktor:Przekaż anonimowy obiekt funkcji na std :: function?

class A { 
public: 
    int operator()(int a, int b) const{ 
    return a + b; 
    } 
}; 
typedef function<int (int, int)> Fun; 

następnie użyć anonimowego funktor utworzyć obiekt std :: function, i znajdę coś dziwnego. Oto mój kod:

Fun f(A()); 
f(3, 4); 

Niestety jest źle. Komunikat o błędzie jest:

error: invalid conversion from ‘int’ to ‘A (*)()’ [-fpermissive] 
error: too many arguments to function ‘Fun f(A (*)())’ 

Jednak, kiedy zmiana kodu następująco:

A a; 
Fun f(a); 
f(3, 4); 

lub

Fun f = A(); 
f(3, 4); 

Wynik jest w porządku. Dlaczego tak jest? Pomóż mi to zrozumieć, proszę. Dzięki.

Odpowiedz

13
Fun f(A()); 

Jest to przypadek most-vexing parse. Deklaruje funkcję f, która zwraca wartość Fun. Zajmuje wskaźnik funkcji jako argument, wskazując na funkcję, która nie przyjmuje argumentów i zwraca wartość A.

Istnieje kilka sposobów, aby ominąć to:

Fun f{A()}; // Uniform-initialisation syntax 
Fun f{A{}}; // Uniform-initialisation on both objects 
Fun f((A())); // Forcing the initialiser to be an expression, not parameter list 

Albo jedna z tych rzeczy, które zrobiłeś.

+0

Uderzyłeś mnie w to. Najbardziej irytujący problem z analizą. –

+0

Czasami terminy z informatyki są nazywane w sposób wprowadzający w błąd. To nie jest jeden z tych czasów. – Yakk