c++ - 在 C++11 中将对象的所有权从一个 unique_ptr 转移到另一个 unique_ptr?

标签 c++ c++11 std move-semantics

C++11中,我们可以使用std::move()将一个对象的所有权转移到另一个unique_ptr。所有权转移后,让出所有权的智能指针变为nullget()返回nullptr.

std::unique_ptr<int> p1(new int(42));
std::unique_ptr<int> p2 = std::move(p1); // Transfer ownership

在将所有权转移到另一个 unique_ptr 时,这在哪些情况下有用?

最佳答案

以下情况涉及从一个 unique_ptr 转移所有权另一个:从函数返回,并作为参数传递给构造函数等函数。

假设你有一些多态类型Animal :

struct Animal {
  virtual ~Animal() {}
  virtual void speak() = 0;
};

带有具体的子类CatDog :

struct Cat : Animal {
  void speak() override { std::cout << "Meow!\n"; }
};

struct Dog : Animal {
  void speak() override { std::cout << "Woof!\n"; }
};

而您想要一个简单的工厂,该工厂根据所需的服从值(value)来创建宠物。然后工厂必须返回一个指针。我们希望宠物工厂将创建的宠物的所有权转移给调用者,因此合理的返回类型是 std::unique_ptr<Animal> :

std::unique_ptr<Animal> createPet(double obedience) {
  if (obedience > 5.0)
    return std::make_unique<Dog>();
  return std::make_unique<Cat>();
} 

现在,假设我们要创建一个 House将拥有宠物,那么我们可能希望将宠物传递给 House 的构造函数.关于如何最好地通过 unique_ptr 存在一些争论(see comments on this blog post)到构造函数,但它看起来像这样:

class House {
 private:
  std::unique_ptr<Animal> pet_;
 public:
  House(std::unique_ptr<Animal> pet) : pet_(std::move(pet)) {}
};

我们通过了unique_ptr进入构造函数,然后将其“move ”到成员变量中。

调用代码可能类似于:

  auto pet = createPet(6.0);
  House house(std::move(pet));

在构建 House 之后, pet变量将是 nullptr因为我们已将宠物的所有权转让给 House .

Live demo

关于c++ - 在 C++11 中将对象的所有权从一个 unique_ptr 转移到另一个 unique_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26318506/

相关文章:

c++ - 使用自己的结构在头类中定义函数?

C++:监视器和条件变量进程间

c++ - eekg() 函数失败

c - 使用 fscanf() 读取一行时遇到问题

c++ - 在 QString 插入函数中使用参数

c++ - 如何在初始化时使用可变参数来在初始化时包括不同数量的对象?

c++ - 访问 mulimap 中的元素

c++ - 如何通过子成员函数创建线程

c++ - std::unordered_set::reserve 对于容器内存需求的作用?

c++ - Node.js C++ 插件 : Threading