我应该对返回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());
或者这种移动优化现在是由编译器自动完成的?
两者都不是:
-
没有任何好处。
-
编译器除了编译C++之外没有什么特别的功能。它可能会努力做好这件事。
幸运的是,表达式generateVector()
已经是一个右值,因此v
将使用move构造函数来构造,但事实上,您对v
的声明和对generateVector
的定义都受到了复制省略,因此该构造可能被视为等价于:
std::vector<int> v(10, 0);
换句话说,语言规则明确允许在这些情况下不调用复制构造函数,即使它们有副作用。
std::move
的目的是将左值转换为右值。在您的情况下,generateVector()
已经是一个右值,因此它是多余的。
返回对象的函数调用的结果已经是右值,因此应用std::move
没有任何好处。
事实上,这可能是一种令人讨厌的现象:如果没有std::move
,变量将直接从临时变量初始化,因此临时变量(和移动)可以被忽略。
相关文章:
- 使用std::函数映射对象方法
- 可组合的lambda/std::函数与std::可选
- 当使用透明的std函数对象时,我们还需要写空的尖括号吗
- std::函数常量正确性未遵循
- 具有变量Number of Arguments的std::函数的矢量
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 如何调用存储在指向"std::函数"的指针中的 lambda?
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 如何将类 1 的 std::函数绑定到类 2 的函数?
- 如何制作可以接受任何类型的参数的 std::函数和 lambda
- 如何将 STL 队列推送函数绑定到 std::函数?
- std::函数不起作用,但普通的旧函数指针可以 - 为什么?
- 获取 std::函数以推断按引用传递/按值传递
- std::bind 和 std::函数术语不值为接受 0 个参数?
- 从其存储的回调中删除 std::函数是否安全
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 创建一个带有 lambda 的 std::函数,而不知道函数的参数
- std::函数的解释
- 在调用过程中删除 std::函数