从类方法编写的lambda函数访问类字段

时间:2012-02-19 17:09:09

标签: c++ lambda c++11

代码示例可能更具描述性:

class CDialog
{
    CButton* ButtonPtr;
    bool m_Visible;
    void SomeMethod ();
}

class CButton
{
public:
    std::tr1::function<void(void)> Function;
}

void CDialog::SomeMethod()
{
    ButtonPtr = new CButton;
    std::tr1::function<void(void)> TempF = [this]
    {
        this->m_Visible = false;
    };
    ButtonPtr->Function = TempF;
}

现在,当我试图调用TempF时,它似乎修改了m_Visible变量的一些副本而不是实际值。我想询问它是否是默认行为,以及是否有某种方式以这种方式使用它。我的修补程序使用指针,它工作得很好,但我很好奇是否可以完成。

编辑:我创建了一个最小的例子,它确实有效。

EDIT2:修正了没有调用函数的错误。

EDIT3:更改为更准确地匹配我的问题。假设单击按钮时调用CButton的函数,并确认。仍然无效。

EDIT4:花了一些时间用调试器检查它。创建函数时使用的“this”指针的值与调用函数时使用的值不同。那么我做错了吗?

EDIT5:在我的代码中发现错误,修复了&amp;结合答案解决了我的问题。感谢所有的回复,感谢你,我今天学到了新东西!

3 个答案:

答案 0 :(得分:4)

根据C ++ 11规范(注意:VC2010实现了一种较旧形式的lambdas,因为规范未完成时),this只能通过值来捕获,不是通过引用。因此,如果您执行[&],则会捕获除this之外的所有内容。

要执行您想要的操作,您必须按值[=]捕获或明确捕获this[&, this]

答案 1 :(得分:3)

我会用

auto TempF = [this](void)
{
    this->m_Visible = false;
};

普遍捕获,ala [&],不是一个好习惯。

答案 2 :(得分:0)

我认为你的观察是错误的。你必须做其他事情。

就我而言,它的行为符合预期,我的意思是调用lambda确实改变了成员变量,而不是成员变量的任何 copy

自己看看:http://ideone.com/DED5k

这种行为是正确的。如果你没有看到这个,那么你的编译器都有bug,或者你正在做其他你在问题中没有提到的事情。