我绑定(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

10-08 09:47
查看更多