在C ++ 14 Lambda表达式中捕获并移动unique_ptr [英] Capture and move a unique_ptr in a c++14 lambda expression

查看:260
本文介绍了在C ++ 14 Lambda表达式中捕获并移动unique_ptr的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在通过lambda表达式捕获这种方式:

I am capturing a unique_ptr in a lambda expression this way:

auto str = make_unique<string>("my string");
auto lambda = [ capturedStr = std::move(str) ] {
   cout << *capturedStr.get() << endl;
};
lambda();

效果很好,直到我尝试移动 capturedStr 到另一个unique_ptr。例如,以下操作不起作用:

It works great until I try to move capturedStr to another unique_ptr. For instance, the following is not working:

auto str = make_unique<string>("my string");
auto lambda = [ capturedStr = std::move(str) ] {
    cout << *capturedStr.get() << endl;
    auto str2 = std::move(capturedStr); // <--- Not working, why?
};
lambda();

以下是编译器的输出:

.../test/main.cpp:11:14: error: call to implicitly-deleted copy
constructor of 'std::__1::unique_ptr<std::__1::basic_string<char>,
std::__1::default_delete<std::__1::basic_string<char> > >'
        auto str2 = std::move(capturedStr);
             ^      ~~~~~~~~~~~~~~~~~~~~~~ ../include/c++/v1/memory:2510:31: note: copy constructor is implicitly
deleted because 'unique_ptr<std::__1::basic_string<char>,
std::__1::default_delete<std::__1::basic_string<char> > >' has a
user-declared move constructor
    _LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u) _NOEXCEPT
                              ^ 1 error generated.

为什么不能移动 capturedStr

推荐答案

lambda的运算符() const 默认状态,并且您不能从 const 对象移动。

The operator () of a lambda is const by default, and you can't move from a const object.

将其声明为可变

auto lambda = [ capturedStr = std::move(str) ] () mutable {
//                                             ^^^^^^^^^^
    cout << *capturedStr.get() << endl;
    auto str2 = std::move(capturedStr);
};

这篇关于在C ++ 14 Lambda表达式中捕获并移动unique_ptr的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆