一个类型是否只能移动,只是因为复制可能很昂贵?

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)

  • 在任何情况下,标准容器都有优先权:虽然前向列表有一个大小,并且`size()`可以实现,但它很昂贵.所以标准省略了`size()`,如果你想知道大小,你必须自己做计算. (2认同)
  • @TimCulver:当然,非可复制类型有理由存在,如果某些东西不需要副本,那么它就不应该执行它(我也喜欢移动语义使容器更加灵活).我的观点是,如果某些东西需要复制的语义,那么应该通过复制的*语法*来提供. (2认同)