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 的情况。