我绑定(bind)到 C++ 03 ,并且我有一个不可复制的对象(例如,持有资源)。
我需要使用移动交换语义来执行类似的操作并避免复制:
MyClass returnMyClass(void)
{
MyClass temp;
// fill 'temp' members with actual data
return temp;
}
int main(void)
{
MyClass test;
test = returnMyClass(); // need to avoid copies
}
是否可以遵守C++ 03中的所有这些要求?
基本上与this相同,但对于C++ 03。
换句话说:
给定不可复制的类
MyClass
,是否可以在 C++ 03 中执行MyClass test = returnMyClass();
?恐怕答案只是而不是,但也许我错过了一些技巧。
最佳答案
移动语义没有魔术。这只是另一个重载。右值引用是一个很好的便利,并不是真正必要的。
template <class T>
struct rref {
rref (T& t) : t(t) {}
T& t;
};
template<class T>
rref<T> move(const T& t) {
return rref<T>(const_cast<T&>(t));
}
// you now can do a "move ctor"
class Foo {
Foo(rref<Foo>) { ... }
};
现在,您还需要NRVO才能使其正常工作。该标准并不能保证它,但是几乎每个实现都可以提供它。为了确保它确实发生,您可以声明但不定义复制ctor。
Full working demo