【问题标题】:How to return a lambda with a captured unique_ptr [duplicate]如何使用捕获的 unique_ptr 返回 lambda [重复]
【发布时间】:2019-10-14 23:59:07
【问题描述】:

使用这个:

https://stackoverflow.com/a/16968463/629530

我可以在 lambda 中捕获 unique_ptr。但是当我尝试使用捕获的 unique_ptr 传递 lambda 函数时遇到问题。这是一个例子:

// test.cc
#include <iostream>
#include <memory>

std::function<int()>
get_func()
{
    auto i = std::make_unique<int>(2);
    return [i=std::move(i)]() {
        return *i;
    };
}

int
main(int argc, char* argv[])
{
    auto func = get_func();
    std::cout << "val: " << func() << std::endl;
    return 0;
}

当我编译时(在我的 mac 上运行,但我在 Linux 中看到类似的错误):

g++ -g -Wall -Werror -std=c++17 test.cc -o test

有很多输出,但这似乎是最突出的部分:

test.cc:9:13: note: copy constructor of '' is implicitly deleted because field '' has a deleted copy constructor
    return [i=std::move(i)]() {
            ^
/Library/Developer/CommandLineTools/usr/include/c++/v1/memory:2490:3: note: copy constructor is implicitly deleted because 'unique_ptr<int, std::__1::default_delete<int> >' has a user-declared move constructor
  unique_ptr(unique_ptr&& __u) noexcept

如果我理解正确,这是因为函数本身被复制了。有没有办法让我将函数 std::move 到调用者以避免返回中的副本?或者我可以用一个输出参数来完成这个吗?

【问题讨论】:

  • 问题比这更早。 std::function requires that the wrapped object be CopyConstructible,但你的 lambda 不是(它只能移动)。失败在于从 lambda 构造 std::function。我们甚至还没有尝试复制std::function。您可以通过直接返回 lambda 而不是将其包装在 std::function 中来解决它。
  • 有趣。 “直接返回 lambda”是什么意思?如果不是 std::function,我的返回类型应该是什么?
  • auto get_func() { return [i=std::make_unique&lt;int&gt;(2)]() { return *i; }; }

标签: c++ lambda c++14 c++17


【解决方案1】:

正如 cmets 中所指出的 - 包裹在 std::function 中的 callable 必须复制可构造的。因此,与其返回函数,不如返回 lambda 本身:

auto get_func()
{
    auto i = std::make_unique<int>(2);
    return [i=std::move(i)]() {
        return *i;
    };
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    相关资源
    最近更新 更多