请查看下面的代码(简要显示):
std::vector<std::string> foo( ... /some params/ ... )
{
std::vector<std::string> retVec;
/.../
return retVec; // --- (1) assume R.V.O happens
}
//code block where we use foo function(neglect scoping just function call)
const auto content_1 = foo( ...); --- (2)
const auto& content_2 = foo( ... ); --- (3)
const auto&& content_3 = foo(...); --- (4)
甚至在(1)行的RVO(返回值优化)我们应该在行上明确调用 std :: move 函数(2)如下所示,以便将返回向量的内容移至 content_1 。
const auto content_1 = std::move(foo( ...)); --- (2)
或之后编译器代码分析然后优化启动并将返回的std :: vector的内容从foo移动到 content_1 ?
答案 0 :(得分:0)
不,对于第一种情况,你不需要移动,因为返回的值已经是一个prvalue,并且没有必要将它与rvalue一致,因为它已经是一个。
如果编译器对此进行了优化(它必须从C ++ 17开始),那么就不会有任何动作。你是对的,在最后两种情况下,不会发生任何复制或移动,编译器也不会忽略调用,因为返回的向量的生命周期已延长。