【问题标题】:Can someone please explain me why can't return a smart pointer?有人可以解释一下为什么不能返回智能指针吗?
【发布时间】:2021-09-24 10:21:15
【问题描述】:

我想知道返回智能指针有什么问题。编译器抛出构造函数本身已被删除。所以我尝试返回引用并且它有效,为什么这可能?

#include <iostream>
#include <memory>
using namespace std;

using unique_int = std::unique_ptr<int>;
unique_int p_Int = std::make_unique<int>();

unique_int GetPtr()
{
    return p_Int;
}

unique_int& GetPtrAddr()
{
    return p_Int;
}

错误信息是

function "std::unique_ptr<_Ty, _Dx>::unique_ptr(const std::unique_ptr<_Ty, _Dx>&)[with _Ty=int, Dx=std::default_delete<int>]"(declared at line 3269 of "memory library path") cannot be referenced -- it is a deleted function

【问题讨论】:

  • 因为它不再是独特的了。
  • ...因为该构造函数已被删除。请在问题中以文本形式包含错误消息
  • 是这样吗?这是我第一次处理这个问题,感谢您的回复!
  • 复制构造函数不能破坏唯一性的唯一方法是转移所有权,但如果复制构造函数这样做会很糟糕。您必须显式移动唯一指针才能转移所有权

标签: c++ smart-pointers


【解决方案1】:

让我们看看当您按值返回 std::unique_ptr 时会发生什么。 unique_int 函数创建一个std::unique_ptr 类型的临时对象,从p_int 复制初始化临时std::unique_ptr,您将返回该对象。但是std::unique_ptr的全部意义在于它不能被复制,只有moved

【讨论】:

  • 感谢这个解释让我明白了,所以基本上 unique_ptr 可以只存在一种类型,但是 shared_ptr 和 weak_ptr 可以有两个具有相同地址的变量。
  • @Game_dev 是的,你没看错。
  • @Game_dev • 如果您需要具有值语义的智能指针,有人为此目的创建了value_ptr
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-02
  • 2014-05-30
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多