无法从Lambda捕获将std ::: move移至lambda内部的函数调用,为什么?

时间:2018-07-31 08:40:38

标签: c++ c++14

在以下代码中

#include <memory>
#include <thread>
#include <utility>

void f1(std::unique_ptr<int>&& uptr) {}

void f(std::unique_ptr<int>&& uptr)
{
    auto thread = std::thread([uptr{ std::move(uptr) }]() {
        f1(std::move(uptr));
    });
}

int main()
{
    return 0;
}

在lambda中对std::move的调用无法编译:

[x86-64 gcc 8.1 #1] error: binding reference of type'std::unique_ptr<int>&&'
to 'std::remove_reference<const> std::unique_ptr<int>&>::type'
{aka 'const std::unique_ptr<int>'} discards qualifiers

实时演示:https://godbolt.org/g/9dQhEX

为什么会出现此错误,我该如何解决? const来自哪里?

2 个答案:

答案 0 :(得分:17)

您需要制作lamdba mutable,因为默认情况下闭包变量是const限定的。

auto thread = std::thread([uptr{ std::move(uptr) }]() mutable {
                                                    //^^^^^^

     f1(std::move(uptr)); /* Works, no constness-violation.*/
 });

答案 1 :(得分:4)

您应该使lambda状态可变:

auto thread = std::thread([uptr{ std::move(uptr) }]() mutable