首页  >  文章  >  后端开发  >  如何正确捕获 C Lambda 表达式中的唯一指针?

如何正确捕获 C Lambda 表达式中的唯一指针?

Patricia Arquette
Patricia Arquette原创
2024-11-21 05:23:10548浏览

How Can I Correctly Capture Unique Pointers in C   Lambda Expressions?

捕获 Lambda 表达式中的唯一指针

尝试捕获 Lambda 表达式中的唯一指针时,通常会遇到困难。考虑以下场景:

std::function<void()> getAction(std::unique_ptr<MyClass> &&psomething) {
    // Caller gives ownership of psomething
    return [psomething]() {
        psomething->do_some_thing();
        // psomething is expected to be released after this point
    };
}

由于 lambda 无法通过引用捕获唯一指针,因此上述代码无法编译。为了解决这个问题,C 14 引入了 lambda 广义捕获。

C 14 中的 Lambda 广义捕获

Lambda 广义捕获允许按值或移动捕获变量。这是通过在捕获唯一指针时利用 = move() 语法来实现的,如下所示:

std::function<void()> getAction(std::unique_ptr<MyClass> psomething) {
    // Caller gives ownership of psomething
    return [auto psomething = std::move(psomething)]() {
        psomething->do_some_thing();
        // psomething is expected to be released after this point
    };
}

通过使用 auto,lambda 会自动推导出 psomething 的类型,这是一个唯一指针。 = std::move(psomething) 表达式显式地将唯一指针的所有权移动到 lambda 表达式中。

移动和复制的实现

复制的实现问题中提供的移动函数对于两阶段复制/移动有效(如[此 StackOverflow问题](https://stackoverflow.com/questions/6322951/whats-the-difference- Between-a-copy-constructor-and-a-move-constructor))。

但是,很重要需要注意的是,C 11 通过 std::move 表达式为 move 函数引入了不同的含义。 std::move 表达式右值限定它所应用到的对象,本质上表明它应该被移动。因此,在 lambda 广义捕获的上下文中,没有必要在唯一指针上显式调用 std::move; lambda 将根据需要自动移动所有权。

以上是如何正确捕获 C Lambda 表达式中的唯一指针?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn