通过变量传递 unique_ptr [重复]
Posted
技术标签:
【中文标题】通过变量传递 unique_ptr [重复]【英文标题】:passing unique_ptr via variable [duplicate] 【发布时间】:2020-07-14 05:23:53 【问题描述】:对于现代 C++,我有点菜鸟。
手头的问题是,我想通过变量将 unique_ptr
传递给 ctor。
一切都很好,如果我直接传递unique_ptr
,但是一旦我将它分配给一个变量,我就会得到一个编译错误:
test.cpp:25:22: 错误:使用已删除的函数‘std::unique_ptr<_tp _dp>::unique_ptr(const std::unique_ptr<_tp _dp>&) [with _Tp = Foo; _Dp = std::default_delete]'
#include <memory>
class Foo
public:
Foo(void) ;
;
class Bar
public:
Bar(std::unique_ptr<Foo> x)
: m_foo(std::move(x))
;
std::unique_ptr<Foo> m_foo;
;
void test(void)
auto bar0 = Bar(std::make_unique<Foo>()); // this works
auto foo = std::make_unique<Foo>(); // this works
auto bar1 = Bar(foo); // this FAILS
和
$ g++ --version
g++ (Debian 9.3.0-8) 9.3.0
$ g++ -c test.cpp -o test.o
test.cpp: In function ‘void test()’:
test.cpp:21:22: error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = Foo; _Dp = std::default_delete<Foo>]’
21 | auto bar1 = Bar(foo);
| ^
In file included from /usr/include/c++/9/memory:80,
from test.cpp:1:
/usr/include/c++/9/bits/unique_ptr.h:414:7: note: declared here
414 | unique_ptr(const unique_ptr&) = delete;
| ^~~~~~~~~~
test.cpp:10:28: note: initializing argument 1 of ‘Bar::Bar(std::unique_ptr<Foo>)’
10 | Bar(std::unique_ptr<Foo> x)
| ~~~~~~~~~~~~~~~~~~~~~^
make: *** [<builtin>: test] Error 1
为什么?
我正在调试的实际代码(并使用新的编译器进行编译)类似于:
auto x = function_creating_a_uniqptr(args,...); // might return NULL
if (pi == nullptr)
return std::make_unique<Plugin>(); // Invalid plug-in
return std::make_unique<Plugin>(x);
【问题讨论】:
【参考方案1】:由于所有权语义,std::unique_ptr<T>
无法共享。复制构造函数特殊成员函数被删除,因此报错。
【讨论】:
【参考方案2】:auto bar1 = Bar(std::move(foo));
foo
是左值,因此编译器将为std::unique_ptr
选择左值引用构造函数(也称为复制构造函数) - 但它已被删除。相反,您必须通过 std::move()
告诉编译器您要使用右值引用构造函数(移动构造函数)
在这个例子中:
auto bar0 = Bar(std::make_unique<Foo>());
std::make_unique<Foo>()
是一个临时对象,它没有名字,所以它是一个右值。无需额外致电std::move
。
【讨论】:
【参考方案3】:你没有遗漏参考资料吗?
提示,在 x 附近。
【讨论】:
绝对不是。查看其他答案。以上是关于通过变量传递 unique_ptr [重复]的主要内容,如果未能解决你的问题,请参考以下文章