Stack Overflow 上有很多关于 std::move 和复制省略之间的交互的线程,例如
什么是复制省略和返回值优化?
如何对复制省略/返回值优化有信心
c++11 返回值优化或移动?
但是,所有这些线程似乎都没有回答这个问题,即是否可以依赖编译器进行必要的优化。
如果在最坏的情况下我们的性能略有下降,这不是问题,但如果由于可能重复的析构函数调用而与正确性冲突,则可能是致命的。
我有以下情况:
class ObjectContainer {
Object* obj;
public:
ObjectContainer(Object* o): obj(o) {}
~ObjectContainer() {
if (obj) delete obj;
}
ObjectContainer(ObjectContainer&& other): obj(other.obj) {
other.obj = nullptr;
}
};
ObjectContainer create_container() {
return ObjectContainer(new Object());
}
那里会发生什么?这能保证工作吗?或者是否存在代码无法编译的情况,或者更糟糕的是,析构函数在同一个对象上被调用两次?
据我了解,如果我声明了移动构造函数,编译器不会生成默认的复制构造函数。我必须指定一个复制构造函数吗?如果我这样做会怎样?或者我应该在 return 语句中使用 std::move 吗?
我将像这样调用上面的方法:
void do_stuff() {
do_some_other_stuff(create_container());
}
void do_some_other_stuff(ObjectContainer const& oc) {
...
}