考虑一下函数的以下片段:
...
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
的第一次和第二次使用是否合理,或者其中一种或两种都不是必需的?
答案 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
为什么呢?因为临时复制和回归价值优化。
它也非常易读。