2014-09-01 2 views
2

Недавно я изучающие лямбда-выражения и следующий код лямбда меня удивляет:Почему тело моего выражения лямбда в функции члена не выполняется?

#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(); 
} 

При выполнении не печатает можно увидеть так, что кажется, тело лямбда-выражения не выполняется вообще, а потом я использую gdb, чтобы доказать это, потому что в функции print_member() нет кода.

Могу ли я спросить, что случилось с моим использованием лямбда?

ответ

11

Похоже, вы забыли выполнить свое выражение лямбда; Вы должны добавить скобки:

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

То есть, ниже заявление:

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

только декларирует лямбда-выражение. В качестве альтернативы вы можете написать:

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

lambda(); 
+0

Привет, кажется, что один из формальных элементов выражения лямбда: [capture-list] (parametr) {body}, что твой последний «()» означает? –

+0

@ LiuNick: да, когда вы объявляете лямбда, вот как это выглядит: [capture-list] (parametr) {body}; но это как объявление функции - она ​​не будет работать, пока вы ее не вызовете. 'lambda()' выполняет тело вашей лямбды, а сама лямбда может быть «встроена», '[capture-list] (parametr) {body}();' вызывает вашу лямбду –

0

спасибо Piotr S, теперь это ясно. Выражение Lambda заключается в объявлении объекта замыкания. и тело lambda expressin находится внутри оператора() этого объекта замыкания, поэтому, если тело нужно выполнить, тогда вызывается operator() shoud.

Смежные вопросы