代码示例可能更具描述性:
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:在我的代码中发现错误,修复并结合答案解决了我的问题。感谢大家的回复,多亏了你们,我今天学到了一些新东西!
最佳答案
根据 C++11 规范(注意:VC2010 实现了旧形式的 lambda,因为规范当时还没有完成),this
只能被 捕获值,而不是引用。因此,如果您执行 [&]
,您将捕获除 this
之外的所有内容。
要执行您想要的操作,您必须按值捕获 [=]
或显式捕获 this
:[&, this]
。
关于c++ - 从用类方法编写的 lambda 函数访问类字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9351240/