【问题标题】:Why is a unique pointer not movable inside a lambda if it's a captured value? [duplicate]如果唯一指针是捕获的值,为什么它不能在 lambda 内移动? [复制]
【发布时间】:2019-08-19 01:11:34
【问题描述】:

以下代码无法编译:

struct S{};

void foo(std::unique_ptr<S> ptr)
{
    auto l = [p = std::move(ptr)]()
    {
        auto p2 = std::move(p);
    };
    l();
}

原因是std::move(p) 返回一个左值引用,因此编译器尝试调用复制构造函数,该构造函数被删除。为什么move 在这里返回左值引用?

Here 是一个完整的样本。

【问题讨论】:

    标签: c++ c++17


    【解决方案1】:

    标记 lambda mutable,否则它的捕获是 const。如

    auto l = [p = std::move(ptr)]() mutable { ... };
    

    【讨论】:

    • 这就解释了。我想知道捕获是否是 const 但智能感知告诉我 pstd::remove_reference&lt;std::unique_ptr&lt;S&gt;&amp;&gt;::type 这让我很困惑。谢谢。
    • @Timo Intellisense 不是编译器。它试图通过部分编译代码和猜测来提供帮助。有时它可能会有所帮助,但永远不要将其视为事实的来源 - 它非常不是
    • @JesperJuhl 是的,我知道,但由于编译器没有给我太多答案(除了我尝试调用已删除的复制构造函数)Intellisense 是我拥有的最接近的信息来源。
    • foo 的参数是按值。将唯一的 ptr 传递(和移动)到 lambda 中应该是 void foo(std::unique_ptr&lt;S&gt;&amp; ptr)。或者,移动可能在调用函数处。
    • 其实operator()这个方法是const,不是captures
    猜你喜欢
    • 2018-06-08
    • 2021-09-15
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    相关资源
    最近更新 更多