【发布时间】:2022-01-12 06:08:28
【问题描述】:
为什么我不能使用std::move 语义(我想)返回一个包含std::unique_ptr 的类,如下例所示?我认为返回会调用 A 类的移动 ctor,这将是 std::move std::unique_ptr。 (我使用的是 gcc 11.2、C++20)
例子:
#include <memory>
class A {
public:
explicit A(std::unique_ptr<int> m): m_(std::move(m)) {}
private:
std::unique_ptr<int> m_;
};
A makit(int num) {
auto m = std::make_unique<int>(num);
return std::move(A(m)); // 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>]'x86-64 gcc 11.2 #1
}
int main() {
auto a = makit(42);
return 0;
}
我相信解决方案是返回 std::unique_ptr,但在我放弃之前,我想知道为什么移动方法不起作用。
【问题讨论】:
-
这不是移动
A,而是移动m,你不要这样做。 -
您的构造函数按值获取参数,而
unique_ptr无法做到这一点。 -
@MarkRansom - 是的,你可以。
-
@StoryTeller-UnslanderMonica 真的吗?那么它是如何保持其独特性的呢?
-
@MarkRansom -
std::move(m),现在参数从右值初始化并且是唯一的所有者。
标签: c++ unique-ptr stdmove