gpt4 book ai didi

c++ - 如何从 C++14 中的广义 lambda 捕获返回包含 std::unique_ptr 的 std::function ?

转载 作者:行者123 更新时间:2023-12-01 17:43:33 25 4
gpt4 key购买 nike

我们如何从 C++14 中的通用 lambda 捕获返回包含 std::unique_ptrstd::function ?具体来说,在下面的代码中

// For std::function
#include <functional>

// For std::iostream
#include <iostream>

// For std::unique_ptr
#include <memory>

#if 0
std::function <void()> make_foo() {
auto x = std::make_unique <int> (3);
return [x=std::move(x)]() {
std::cout << *x << std::endl;
};
}
#endif

int main() {
auto x = std::make_unique <int> (3);
auto foo = [x=std::move(x)]() {
std::cout << *x << std::endl;
};
foo();
}

在打开 GCC 4.9.2 和 C++14 的情况下运行时一切正常。具体来说,它表明广义 lambda 捕获工作。但是,当我们更改 #if 1 的代码时,我们会得到编译错误:

g++ -g -std=c++14 test01.cpp -o test01
In file included from test01.cpp:4:0:
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.2/include/g++-v4/functional: In instantiation of 'static void std::_Function_base::_Base_manager<_Functor>::_M_clone(std::_Any_data&, const std::_Any_data&, std::false_type) [with _Functor = make_foo()::<lambda()>; std::false_type = std::integral_constant<bool, false>]':
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.2/include/g++-v4/functional:1914:51: required from 'static bool std::_Function_base::_Base_manager<_Functor>::_M_manager(std::_Any_data&, const std::_Any_data&, std::_Manager_operation) [with _Functor = make_foo()::<lambda()>]'
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.2/include/g++-v4/functional:2428:19: required from 'std::function<_Res(_ArgTypes ...)>::function(_Functor) [with _Functor = make_foo()::<lambda()>; <template-parameter-2-2> = void; _Res = void; _ArgTypes = {}]'
test01.cpp:17:5: required from here
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.2/include/g++-v4/functional:1878:34: error: use of deleted function 'make_foo()::<lambda()>::<lambda>(const make_foo()::<lambda()>&)'
__dest._M_access<_Functor*>() =
^
test01.cpp:15:27: note: 'make_foo()::<lambda()>::<lambda>(const make_foo()::<lambda()>&)' is implicitly deleted because the default definition would be ill-formed:
return [x=std::move(x)]() {
^
test01.cpp:15:27: error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp = std::default_delete<int>]'
In file included from /usr/lib/gcc/x86_64-pc-linux-gnu/4.9.2/include/g++-v4/memory:81:0,
from test01.cpp:10:
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.2/include/g++-v4/bits/unique_ptr.h:356:7: note: declared here
unique_ptr(const unique_ptr&) = delete;
^
Makefile:2: recipe for target 'all' failed
make: *** [all] Error 1

现在,鉴于我们返回的函数包含 std::unique_ptr,我们无法复制生成的 std::function 是有道理的。然而,由于我们返回一个动态创建的 lambda 函数,这不应该是一个 r 值并且定义有效吗?基本上,有什么方法可以修复 make_foo 吗?我们仍然有 std::unique_ptr 的通用 lambda 捕获?

最佳答案

作为@T.C.在评论中说,std::function requires它包装的可调用对象是可复制构造的,并且您的 lambda 不是因为 unique_ptr 数据成员。

您可以利用 C++14 的函数返回类型推导从 make_foo 返回 lambda,并避免将其包装在 std::function 中。

auto make_foo() {
auto x = std::make_unique <int> (3);
return [x=std::move(x)]() {
std::cout << *x << std::endl;
};
}

make_foo()(); // prints 3

Live demo

关于c++ - 如何从 C++14 中的广义 lambda 捕获返回包含 std::unique_ptr 的 std::function ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31691309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com