C++ lambda 封装的有多好,它能删除它的 "containing" 对象吗?
How encapsulated is a C++ lambda, can it delete its "containing" object?
我正在向我的包含实例添加一个按钮,如下所示:
pPromptDlg->addBtn("Okay", [](int &loopState) {
loopState = GlobalDefs::kGameRequestingBack;
}, true);//true because it handles the "back" button
我要让它设置它包含的实例的 int
成员(到 enum
值),表明不再需要它,但这很麻烦而且有潜在危险,所以我' d 更愿意尝试
pPromptDlg->addBtn("Okay", [](int &loopState) {
loopState = GlobalDefs::kGameRequestingBack;
delete pPromptDlg;
pPromptDlg = nullptr;
}, true);
然后我可以只检查 if (pPromptDlg)
并不管它。
我知道 lambda 有效地设置了一个 class,很像 enum
classes 但是 enum
需要解析包含它们定义的 class 所以我猜那里在 lambda 中删除 class 的实例会有副作用吗?
这是可能的还是只是懒惰?谢谢。
当然,您只需捕获 pPromptDlg
即可:
pPromptDlg->addBtn("Okay", [&pPromptDlg](int &loopState) {
// ^^^^^^^^^^^ by reference, so that...
loopState = GlobalDefs::kGameRequestingBack;
delete pPromptDlg;
pPromptDlg = nullptr; // <-- ... this line does something meaningful*
}, true);
*有意义,我的意思是通过引用捕获将允许您将 lambda 外部的 pPromptDlg
设置为 nullptr
。但是,即使在按值捕获中,该行仍然有用,因为它将优雅地处理多次调用 lambda 的情况。
我正在向我的包含实例添加一个按钮,如下所示:
pPromptDlg->addBtn("Okay", [](int &loopState) {
loopState = GlobalDefs::kGameRequestingBack;
}, true);//true because it handles the "back" button
我要让它设置它包含的实例的 int
成员(到 enum
值),表明不再需要它,但这很麻烦而且有潜在危险,所以我' d 更愿意尝试
pPromptDlg->addBtn("Okay", [](int &loopState) {
loopState = GlobalDefs::kGameRequestingBack;
delete pPromptDlg;
pPromptDlg = nullptr;
}, true);
然后我可以只检查 if (pPromptDlg)
并不管它。
我知道 lambda 有效地设置了一个 class,很像 enum
classes 但是 enum
需要解析包含它们定义的 class 所以我猜那里在 lambda 中删除 class 的实例会有副作用吗?
这是可能的还是只是懒惰?谢谢。
当然,您只需捕获 pPromptDlg
即可:
pPromptDlg->addBtn("Okay", [&pPromptDlg](int &loopState) {
// ^^^^^^^^^^^ by reference, so that...
loopState = GlobalDefs::kGameRequestingBack;
delete pPromptDlg;
pPromptDlg = nullptr; // <-- ... this line does something meaningful*
}, true);
*有意义,我的意思是通过引用捕获将允许您将 lambda 外部的 pPromptDlg
设置为 nullptr
。但是,即使在按值捕获中,该行仍然有用,因为它将优雅地处理多次调用 lambda 的情况。