当一对昂贵的物品存放在一对时,std :: move是否必要?

时间:2014-12-20 01:19:30

标签: c++ move move-semantics std-pair

考虑一下函数的以下片段:

...
std::string someStdString;
...
// someStdString is filled here.
...
StringWrapper wrapper {std::move(someStdString)}; // First std::move usage.
return std::pair<bool, StringWrapper> {true, std::move(wrapper)}; // Second usage.

StringWrapper类实现了所有四个复制和移动构造函数和赋值运算符,其构造函数是显式的。

std::move的第一次和第二次使用是否合理,或者其中一种或两种都不是必需的?

3 个答案:

答案 0 :(得分:3)

是的,需要两个std::move来确保调用移动构造函数。简单的经验法则是&#34;如果它有一个名字,那就是左值。&#34;唯一的例外是当您返回一个即将超出范围的自动持续时间对象时 - 此对象被视为xvalue并且优先绑定到移动构造函数。

答案 1 :(得分:2)

std::pair<bool, StringWrapper> foo() {
  std::string someStdString;
  // ... someStdString is filled here. ...
  return {true, std::move(someStdString)};
}

我认为没有理由包含大部分代码,更不用说两个move

std::make_pair如果你想明确返回一对,或者是半兼容的编译器。

如上所述,StringWrapper可以隐式创建std::string,因此隐式创建不应该造成混淆。

答案 2 :(得分:0)

这是有效的。

return std::make_pair(true, StringWrapper { std::move(someStdString });

总移动次数:1

为什么呢?因为临时复制和回归价值优化。

它也非常易读。