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

Bar*_*icz 2 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

EDIT2:修复了不调用函数的错误。

EDIT3:更改为更准确地匹配我的问题。假设单击按钮时调用了 CButton 的函数,并确认。还是不行。

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

EDIT5:在我的代码中发现错误,修复并结合答案解决了我的问题。感谢大家的回复,感谢你们,我今天学到了一些新东西!

Ben*_*igt 5

我会用

auto TempF = [this](void)
{
    this->m_Visible = false;
};
Run Code Online (Sandbox Code Playgroud)

唉,通用捕获[&]并不是一个好的做法。


Nic*_*las 5

根据 C++11 规范(注意:VC2010 实现了旧形式的 lambdas,因为规范在它们完成时还没有完成),this只能通过value而不是通过引用来捕获。因此,如果您这样做[&],您将捕获除 之外的所有内容this

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

  • 通过值捕获 *pointer*,这与通过引用捕获 *object* 实际上相同。 (3认同)