我应该对返回std::vector的函数使用std::move吗

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

本文关键字:std 函数 move vector 返回 我应该      更新时间:2023-10-16

考虑这类函数:

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

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

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

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

两者都不是:

  • 没有任何好处。

  • 编译器除了编译C++之外没有什么特别的功能。它可能会努力做好这件事。

幸运的是,表达式generateVector()已经是一个右值,因此v将使用move构造函数来构造,但事实上,您对v的声明和对generateVector的定义都受到了复制省略,因此该构造可能被视为等价于:

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

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

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

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

事实上,这可能是一种令人讨厌的现象:如果没有std::move,变量将直接从临时变量初始化,因此临时变量(和移动)可以被忽略。