是否可以在 C++03 中定义'move-and-swap idiom'等效项



我绑定到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中遵守所有这些要求?

这基本上是相同的情况,但对于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。

完整工作演示

如果您可以在声明时初始化对象test,您将能够避免复制,因为将执行复制省略。

class MyClass
{
public:
MyClass(){std::cout << "Default Constructor" << std::endl;}
MyClass(const MyClass &){std::cout << "CPYConstructor" << std::endl;}
~MyClass() {std::cout << "Destructor" << std::endl;}
};

MyClass returnMyClass(void)
{
MyClass temp;
// fill 'temp' members with actual data
return temp;
}
int main(void)
{
MyClass test = returnMyClass(); // need to avoid copies
}

输出:

Default Constructor
Destructor

相关内容

  • 没有找到相关文章

最新更新