std :: vector <std :: string>的内容在被指定为R值时会被移动吗?

时间:2017-10-10 05:19:43

标签: c++ c++11 visual-c++ c++14 c++17

请查看下面的代码(简要显示):

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

  • 如果编译器优化了这个,它会发生在任何类型都可以的向量上 移动可构造并移动可分配?
  • 行号(3)(4)数据移动操作不会发生 理论上?

1 个答案:

答案 0 :(得分:0)

不,对于第一种情况,你不需要移动,因为返回的值已经是一个prvalue,并且没有必要将它与rvalue一致,因为它已经是一个。

如果编译器对此进行了优化(它必须从C ++ 17开始),那么就不会有任何动作。你是对的,在最后两种情况下,不会发生任何复制或移动,编译器也不会忽略调用,因为返回的向量的生命周期已延长。