想象一下以下代码
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; }
}
我是否需要实施有关“返回新车()”的移动操作?或者因为指针的使用它们是无意义的? 在哪种情况下,默认的移动操作是否足够?
干杯!
答案 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。