7

我们在一些功能中有这个:

BigClass big;
// prepare big somehow
OtherClass foo(std::move(big), maybe, other, params);
// know that we won't be using "big" after this.

如今,大多数 C++ 编码人员是否会真正将移动放在那里以保证移动?

4

3 回答 3

10

在您的特定代码中,您要么直接移动,要么根本不移动。编译器永远不会移出左值(不是eXpiring)。

于 2013-02-07T19:43:56.567 回答
1

我会把它放在std::move那里以便有一个动作,因为否则不会有。:)

另一种选择是:

auto MakeBig = [&]()->BigClass {
  BigClass big;
  //prepare big somehow
  return big; // must be a `move`, if not elided!
};

OtherClass foo(MakeBig(), maybe, other, params);

或者,如果你不是胆小的话:

OtherClass foo([&]()->BigClass {
  BigClass big;
  //prepare big somehow
  return big; // must be a `move`, if not elided!
}(), maybe, other, params);

我们将 up 的创建包装big到一个 lambda 中,然后推迟创建。请注意,这并不总是有效。

这种模式的一个优点是,如果将其第一个参数按值取值,则可以省略该移动foo,并且按值取值现在对于将要复制的有move能力的类来说是正确的方法。OtherClass如果它不按值获取第一个参数,则为构造创建的临时变量foo仍然可以省略,因此只会foo发生一次移动(在临时变量和 之间)。

于 2013-02-07T19:43:22.247 回答
0

如果您使用 C++11,有时编译器会为您移动(R 值引用),但如果您想显式移动一个大对象,那么是的,您应该使用显式“移动”它

std::move

更多信息

于 2013-02-07T19:46:22.713 回答