捕获 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中文网其他相关文章!