我什么时候需要移动操作,c ++

时间:2017-07-03 14:18:05

标签: c++ pointers move

想象一下以下代码

 struct Vehicle { virtual void drive() = 0; };
 struct Car: public Vehicle { 
   void drive() override { std::cout <<   "driving a car\r\n"; } 
 };
 struct Cycle : public Vehicle { 
   void drive() override { std::cout << "driving a cycle\r\n"; } 
 };
 Vehicle* makeVehicle(const std::string& type) {
   if (type == "car") { return new Car(); } 
   else if (type == "cycle") { return new Cycle(); } 
   else { return nullptr; } 
 }

我是否需要实施有关“返回新车()”的移动操作?或者因为指针的使用它们是无意义的? 在哪种情况下,默认的移动操作是否足够?

干杯!

1 个答案:

答案 0 :(得分:3)

如果你有移动,你有C ++ 11,如果你有C ++ 11,你有unique_ptr。所以你实际上想要编写这样的代码:

std::unique_ptr<Vehicle> makeVehicle(const std::string& type {
    if (type == "car") { return std::make_unique<Car>(); }
    ...
}

unique_ptr表示调用makeVehicle的人现在拥有返回的对象,并将自动确保它被销毁并返回内存。 unique_ptr自动实现移动操作,这就是为什么这段代码可以编译(如果它不可移动或可复制,则无法从函数返回它)。

基本上,对于多态类型,通常不需要实现移动操作。但是unique_ptr并不提供复制操作,因此您仍然可能希望实现oldie-but-goldie clone函数(如果您确实需要它)。

我建议阅读更多关于移动语义的内容,特别是&#34;零规则&#34 ;;一般来说,最好避免在可能的情况下手动执行复制/移动。请参阅:http://en.cppreference.com/w/cpp/language/rule_of_three