0

如果 lambda 通过引用捕获将与 lambda 一起返回的值。调用 lambda 时引用是否成立?

#include <memory>
#include <functional>

struct context_with_callback {
    bool flag = false;
    std::function<void()> callback;
};

std::unique_ptr<context_with_callback> make_context() {
    auto ctx_with_callback = std::make_unique<context_with_callback>();
    ctx_with_callback->callback = [&] () { 
        ctx_with_callback->flag = true; 
    };

    return ctx_with_callback; // am I allowed to do that?
};

int main() {
    auto ctx = make_context();
    ctx->callback(); // will this be always valid?
    return 0;
}

如果它无效,我可以通过复制来捕获原始指针,但也许有更好的方法?

4

1 回答 1

1

您“可以”通过引用捕获自动变量,但是如果您返回 lambda,这将没有用,因为一旦函数返回,引用就会悬空。

return ctx_with_callback; // am I allowed to do that?

从技术上讲是的,但它不会有用。

ctx->callback(); // will this be always valid?

鉴于当前的实现,这永远不会有效。


这将起作用,甚至允许按值返回上下文,如果您愿意,可以避免动态分配:

struct context_with_callback {
    bool flag = false;
    std::function<void(context_with_callback&)> callback_object;
    
    void callback() {
        callback_object(*this);
    }
};

context_with_callback make_context() {
    return {
        .flag = false,
        .callback_object = [](context_with_callback& ctx_with_callback) { 
            ctx_with_callback.flag = true; 
        },
    };
}
于 2021-01-08T11:21:57.857 回答