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