代码示例可能更具描述性:
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;结合答案解决了我的问题。感谢所有的回复,感谢你,我今天学到了新东西!
答案 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 。
这种行为是正确的。如果你没有看到这个,那么你的编译器都有bug,或者你正在做其他你在问题中没有提到的事情。