我们在一些功能中有这个:
BigClass big;
// prepare big somehow
OtherClass foo(std::move(big), maybe, other, params);
// know that we won't be using "big" after this.
如今,大多数 C++ 编码人员是否会真正将移动放在那里以保证移动?
我们在一些功能中有这个:
BigClass big;
// prepare big somehow
OtherClass foo(std::move(big), maybe, other, params);
// know that we won't be using "big" after this.
如今,大多数 C++ 编码人员是否会真正将移动放在那里以保证移动?
在您的特定代码中,您要么直接移动,要么根本不移动。编译器永远不会移出左值(不是eXpiring)。
我会把它放在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
发生一次移动(在临时变量和 之间)。