Tim*_*ver 10 c++ move-semantics c++11
我有一个可复制的类型,但复制可能很昂贵.我已经实现了移动构造函数和移动赋值.但是我遇到性能问题,人们忘记在传递值时调用move().
是否有良好的C++ 11样式来删除复制构造函数,而是为实际需要复制的罕见情况提供显式的copy()方法?这在其他语言(Ruby,JavaScript)中是惯用的,但我不知道C++标准库中的任何内容都禁止纯粹为了性能而复制.例如,std :: vector <>是可复制的,而std :: unique_ptr <>和std :: thread由于其他原因是不可复制的.
And*_*owl 11
一个类型是否只能移动,只是因为复制可能很昂贵?
不.如果你的类型的语义是这样的,复制它在概念上是有意义的,那么使复制可用的正确方法是实现一个复制构造函数,并让用户有机会采用标准语法来调用它:
T a;
T a = b;
Run Code Online (Sandbox Code Playgroud)
如果人们忘记从他们不想再使用的物体移动......嗯,这是他们的坏事:
T c = std::move(a); // I'm doing it right (if I no longer need object a);
T d = b; // If I don't need b anymore, I'm doing it wrong.
Run Code Online (Sandbox Code Playgroud)
如果(出于任何原因)对于你的某些函数,总是希望调用者提供一个可以从中移动的对象,然后让函数接受一个右值引用:
void foo(my_class&& obj);
my_class a;
foo(a); // ERROR!
foo(std::move(a)); // OK
Run Code Online (Sandbox Code Playgroud)