最近我一直在研究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有什么问题?
答案 0 :(得分:11)
看起来你忘了执行你的lambda表达式;你应该添加parens:
[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();
答案 1 :(得分:0)
感谢Piotr S,现在很清楚了。 Lambda表达式是声明闭包对象。 lambda expressin的主体位于该闭包对象的operator()内部,因此如果需要执行主体,则应调用operator()。