考虑这种功能:
std::vector<int> generateVector() {
return std::vector<int>(10, 0);
}
调用generateVector()有什么好处:
std::vector<int> v = std::move(generateVector());
..或者这种移动优化现在是由编译器自动完成的吗?
答案 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
,变量直接从临时初始化,因此可以省略临时(和移动)。