首页 > 解决方案 > 是否可以在 C++03 中定义等效的“移动和交换习语”

问题描述

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

恐怕答案是否定的,但也许我错过了一些技巧。

标签: c++movec++03

解决方案


移动语义没有魔法。这只是另一个超载。右值引用的东西是一个很好的便利,并不是很重要。

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。

完整的工作演示


推荐阅读