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

Should I use std::move on functions returning std::vector?

考虑这样一个函数:

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

像这样调用 generateVector() 有什么好处吗:

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

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

std::move的目的是将左值变成右值。在你的例子中,generateVector() 已经是一个右值,所以它是多余的。

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

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

两者都不是:

  • 没有任何好处。

  • 编译器除了编译C++外没有做任何特别的事情。它可能会尝试做好这件事。

幸运的是,表达式 generateVector() 已经是一个右值,所以 v 将使用移动构造函数构造,但实际上你对 v 的声明和对 generateVector 受复制省略的影响,因此可以将构造视为等同于:

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

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