2014-04-08 204 views
45

當我讀Cocos2dx 3.0 API,我發現這樣的事情:什麼是 「[這]」 意味着C++

auto listener = [this](Event* event){ 
    auto keyboardEvent = static_cast<EventKeyboard*>(event); 
    if (keyboardEvent->_isPressed) 
    { 
     if (onKeyPressed != nullptr) 
      onKeyPressed(keyboardEvent->_keyCode, event); 
    } 
    else 
    { 
     if (onKeyReleased != nullptr) 
      onKeyReleased(keyboardEvent->_keyCode, event); 
    } 
}; 

是什麼[this]意思?這是C++11中的新語法嗎?

+12

這是拉姆達以及你目前的實例綁定到它。 – Zeta

+5

這意味着你捕獲'this'。 – rightfold

+1

明確提及'this'真的有意義嗎?它不會自動被「onKeyPressed」和「onKeyReleased」引用捕獲(假設它們是'this'的成員)。同時警告,'keyboardEvent'現在持有'this'指針的副本...臨頭你,如果'keyboardEvent'設法活得比任何'this'所指向....(標準對象的生命週期問題) –

回答

57

[this]是什麼意思?

它引入了一個可調用函數對象lambda。在括號把this意味着拉姆達捕獲this,從而使該對象的成員是在其內可用。如鏈接頁面中所述,Lambdas還可以按值或引用捕獲局部變量。

拉姆達具有operator()的過載,使得它可以被稱爲像函數:

Event * event = some_event(); 
listener(event); 

這將運行在lambda的主體定義的代碼。

在C++ 11這個新的語法?

是。

+0

我並不想成爲PIA的,我真正感興趣如果術語「'運算符()的重載*'*」在技術上是正確嗎?我知道'ClosureType'是一個類型並且有一個成員函數'operator()',但我認爲它在任何時候都不會被重載,或者它是什麼? – luk32

+1

@ luk32它重載內置操作符,就像用戶聲明的操作符重載一樣。 –

+0

嗯,**可以**,當我們談論的是隻能被聲明爲一個類的方法操作,是不是「過載」,因爲它是由該類默認定義手段。然而,對於運營商而言,一般都認爲它們「超載」,因爲它總是被稱爲可調用的東西,這已經在其他地方定義了。結果,每個運營商定義都是「超載」。 – Ethouris