代码示例可能更具描述性:
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:在我的代码中发现错误,修复并结合答案解决了我的问题。感谢大家的回复,感谢你们,我今天学到了一些新东西!
我会用
auto TempF = [this](void)
{
this->m_Visible = false;
};
Run Code Online (Sandbox Code Playgroud)
唉,通用捕获[&]并不是一个好的做法。
根据 C++11 规范(注意:VC2010 实现了旧形式的 lambdas,因为规范在它们完成时还没有完成),this只能通过value而不是通过引用来捕获。因此,如果您这样做[&],您将捕获除 之外的所有内容this。
要执行您想要的操作,您必须按值[=]捕获或this显式捕获:[&, this]。
| 归档时间: |
|
| 查看次数: |
2623 次 |
| 最近记录: |