2014-09-01 22 views
2

最近我一直在研究lambda表達式和下面的拉姆達代碼讓我吃驚:爲什麼我的lambda表達式在成員函數中的主體沒有被執行?

#include <iostream> 

class lambda_this_test 
{ 
private: 
    int mNumber; 
public: 
    lambda_this_test() 
    { 
     mNumber = 11; 
    }; 
    void print_member() 
    { 
     //lambda expression 
     [this]{mNumber = 12; std::cout<< "mNumber = \n"<<mNumber<<std::endl;}; 
    } 
}; 

int main() 
{ 
    lambda_this_test testClass; 

    testClass.print_member(); 
} 

執行時,沒有打印可以看出,這樣似乎完全不執行的lambda表達式的身體,然後我用gdb來證明這一點,因爲print_member()函數中沒有代碼。

請問我使用lambda有什麼問題?

回答

11

看起來你忘記了執行你的lambda表達式;你應該加上括號:

[this]{mNumber = 12; cout<< "mNumber = \n"<<mNumber<<endl;}(); 
//               ^^ 

也就是說,下面的語句:

[this]{mNumber = 12; cout<< "mNumber = \n"<<mNumber<<endl;}; 

只是聲明瞭一個lambda表達式。或者,您可以這樣寫:

auto lambda = [this]{mNumber = 12; cout<< "mNumber = \n"<<mNumber<<endl;}; 

lambda(); 
+0

嗨,看起來lambda表達式的正式風格之一是 [capture-list](parametr){body},你最後的「()」是什麼意思? – 2014-09-02 07:11:28

+0

@LiuNick:是的,當你聲明lambda時,這是它的樣子:[capture-list](parametr){body};但這就像聲明一個函數一樣 - 直到調用它纔會起作用。 'lambda()'執行你的lambda體,並且lambda本身可以被「內聯」,'[capture-list](parametr){body}();'調用你的lambda – 2014-09-02 13:09:15

0

感謝Piotr S,現在已經很清楚了。 Lambda表達式是聲明閉包對象。 lambda表達式的主體位於該閉包對象的operator()內,因此如果需要執行主體,則應調用operator()。

相關問題