2015-07-28 37 views
3

我有一個問題,其中鐺(3.6)和G ++(5.1)具有一個不同的觀點:在通用拉姆達捕獲使用該指針

#include <functional> 

struct X 
{ 
    X() 
    { 
     std::function<void (int)> f = [this](auto x){foo(x);}; 
    } 

    void foo(int x){} 
}; 

int main(){} 

鐺接受此,而G ++規定:

error: cannot call member function ‘void X::foo(int)’ without object 

如果我直接調用this->foo(x),兩個編譯器都會接受它,但我寧願知道誰是對的。

注意:lambda簽名中的「auto」和轉換爲std :: function <>都需要觸發這種情況。

+5

它在[GCC 5.2](http://melpon.org/wandbox/permlink/dQyllaVrippXSDlZ)中編譯 –

+1

帶有金色徽章和3k +聲望,您肯定知道您必須將主要語言標記添加到問題? –

+0

@KerrekSB,顯然是帕斯卡。我永遠不會明白,爲什麼人們覺得有必要做出這樣的評論,當它不阻止他們回答這個問題時。如果你不知道繼續前進。 – Blindy

回答

1

如果我直接調用this-> foo(x),兩個編譯器都會接受它,但我寧願知道誰是對的。

考慮到它在gcc 5.2中編譯,clang是在你的具體情況下正確的一個。它看起來只是gcc 5.1中的一個bug。 gcc 6.0也編譯這個罰款。

加上它很直觀,this應該暗示。

+0

我想接受這一點,但儘管我希望「無用」代碼是正確的,我不覺得它很直觀:lambdas已經呈現給我們的方式就好像它是一個表示lambda語句的類中的隱藏運算符()。如果您遵循該行,「this->」指的是lambda,而不是包含的類。或者也許我只是在推翻它,因爲那樣會使捕捉「這個」變得無法使用。 –