2014-12-02 133 views
9

這裏是我的問題: 我定義了一個函子:將匿名函數對象傳遞給std :: function?

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

然後我用一個匿名函子來創建一個std ::函數對象,我覺得有些奇怪。這裏是我的代碼:

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

不幸的是這是錯的。該錯誤信息是:

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

但是,當我改變我的代碼如下:

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

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

結果是正確的。 那麼,爲什麼呢?請幫助我理解它。謝謝。

回答

13
Fun f(A()); 

這是most-vexing parse的情況。它聲明瞭一個函數f,它返回Fun。它將函數指針作爲參數,指向不帶參數的函數並返回A

有幾種方法來解決這個問題:

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 

或你做的事情之一。

+0

你打敗了我。最令人煩惱的解析問題的確如此。 – 2014-12-02 14:47:51

+0

有時候,計算機科學中的術語會以誤導的方式命名。這不是其中之一。 – Yakk 2014-12-02 18:15:20

相關問題