【发布时间】: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::functionrequires 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<int>(2)]() { return *i; }; }