我有一个非常基本的问题:使用std::move返回std::vector<A>是个好主意吗?例如:
class A {};
std::vector<A> && func() {
std::vector<A> v;
/* fill v */
return std::move(v);
}我是否应该返回std::map,std::list..等等。用这种方式?
发布于 2017-05-19 17:21:37
你声明一个函数通过r值引用返回--这几乎不应该这样做(如果你通过引用返回本地对象,你最终会得到一个悬空的引用)。取而代之的是声明函数以按值返回。这样,调用者的值将由函数返回的r值移动构造。返回值还将绑定到任何引用。
其次,不,您不应该使用显式std::move返回,因为这将阻止编译器使用RVO。没有必要,因为如果可能的话,编译器会自动将返回的任何l值引用转换为r值引用。
std::vector<A> func() {
std::vector<A> v;
/* fill v */
return v; // 'v' is converted to r-value and return value is move constructed.
}更多信息:
发布于 2017-05-19 17:24:05
不,不是的。在某些情况下,这实际上可以防止复制遗漏。在一些编译器中甚至有一个关于它的警告,称为-Wpessimizing-move。
与其他答案一致,只需按值返回它,将返回类型更改为简单的std::vector<A>,编译器将在需要时负责调用移动构造函数。
你可以看看我刚刚找到的这篇文章,它似乎很详细地解释了它(尽管我自己没有读过它):https://vmpstr.blogspot.hu/2015/12/redundant-stdmove.html
发布于 2017-05-19 17:13:40
在返回局部变量和编写std::move()时,启用了优化的gcc和clang编译器都会为这两种情况生成相同的二进制代码。只要返回一个值即可。
但是,如果为自定义类创建移动构造函数和移动operator=,则使用&&和noexcept说明符非常有用
https://stackoverflow.com/questions/44065808
复制相似问题