以下情形涉及从一个unique_ptr
转移到另一个所有权:从函数返回,并作为参数传递给像一个构造函数。
说你有一些多态型Animal
:
struct Animal {
virtual ~Animal() {}
virtual void speak() = 0;
};
与具体子类Cat
和Dog
:
struct Cat : Animal {
void speak() override { std::cout << "Meow!\n"; }
};
struct Dog : Animal {
void speak() override { std::cout << "Woof!\n"; }
};
你想要一个简单的工厂,创建基于服从的要求值的宠物。然后工厂必须返回一个指针。我们希望宠物工厂创建宠物的所有权转移给调用者这样一个合理的返回类型为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
的构造函数。还有一些争议(see comments on this blog post)关于如何最好的unique_ptr
传递给构造函数,但它会是这个样子:
class House {
private:
std::unique_ptr<Animal> pet_;
public:
House(std::unique_ptr<Animal> pet) : pet_(std::move(pet)) {}
};
我们已通过了unique_ptr
到构造,并再“移动”,它给成员变量。
调用代码可能看起来是这样的:
auto pet = createPet(6.0);
House house(std::move(pet));
构建House
后,pet
变量会nullptr
因为我们已经转移了宠物所有权有关的House
。
Live demo
就是这样。标准库中的智能指针不应该被看作是自动释放的指针,而是根据*所有权*。你有一些数据只能由一个实体“拥有”,然后使用唯一的指针。 – 2014-10-11 19:41:07
当您使用线程或套接字等不可复制的数据进行工作时,并且您需要将其从一个位置替换为另一个位置(例如,将其放入向量中),这非常有用。 – wowofbob 2014-10-11 19:59:55