我应该在返回std :: vector的函数上使用std :: move吗?

时间:2015-03-31 14:57:57

标签: c++ c++11 move-semantics

考虑这种功能:

std::vector<int> generateVector() {
    return std::vector<int>(10, 0);
}

调用generateVector()有什么好处:

std::vector<int> v = std::move(generateVector());

..或者这种移动优化现在是由编译器自动完成的吗?

3 个答案:

答案 0 :(得分:8)

既不:

  • 没有任何好处。

  • 除编译C ++外,编译器没有什么特别之处。它可能会尝试做得很好。

幸运的是,表达式generateVector()已经是一个右值,因此v将使用移动构造函数构建,但事实上您的v声明和generateVector的定义复制省略,因此建筑可以被视为等同于:

std::vector<int> v(10, 0);

换句话说,语言规则明确允许在这些情况下不要调用复制构造函数,即使它们有副作用。

答案 1 :(得分:7)

std::move的目的是将左值变为右值。在您的情况下,generateVector()已经是右值,因此它是多余的。

答案 2 :(得分:6)

返回对象的函数调用的结果已经是 rvalue ,因此应用std::move没有任何好处。

实际上它可能是一种悲观:没有std::move,变量直接从临时初始化,因此可以省略临时(和移动)。