为什么我的lambda表达式在成员函数中的主体没有被执行?

时间:2014-09-01 08:09:26

标签: c++ c++11 lambda

最近我一直在研究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有什么问题?

2 个答案:

答案 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()。