将返回一个向量<vector <int =“”>&gt;从函数调用C ++ 11中的任何移动构造函数</vector>

时间:2013-11-18 08:25:02

标签: c++ c++11 move-semantics

在C ++ 11中,将从函数返回vector<vector<int> >调用任何移动构造函数?或者下面的代码是否只是制作了所有向量及其元素的另一个副本?

vector< vector<int> > Func() {
  vector< vector<int> > vec;
  //vec is filled here
  return vec;
}

对于简单类型的stl容器,当使用移动构造函数时会有一个常规,或者在从函数返回它们时复制它们吗?

1 个答案:

答案 0 :(得分:3)

return语句特别涵盖在标准中,可自动视为移动。所以,是的,这将调用移动构造函数。

此法律的字母是C ++ 11,[class.copy]§31+32

  

31 当满足某些条件时,允许实现省略类对象的复制/移动构造...复制/移动操作的省略,称为复制省略,在以下情况下允许(可以合并以消除多个副本):      

      
  • 在具有类返回类型的函数的return语句中,当表达式是具有与函数返回类型相同的cvunqualified类型的非易失性自动对象(函数或catch子句参数除外)的名称时,通过将自动对象直接构造为函数的返回值
  • ,可以省略复制/移动操作   
  • ...
  •   
     

32 当满足或将满足复制操作的省略标准时,除了源对象是函数参数,并且要复制的对象由左值指定,首先执行重载决策以选择副本的构造函数,就好像该对象由rvalue指定一样。如果重载决策失败,或者所选构造函数的第一个参数的类型不是rvalue引用对象的类型(可能是cv-qualified),再次执行重载决策,将对象视为左值。   ...

(强调我的)

组合并应用于您的情况,这意味着当从函数返回局部变量时,首先尝试移动,并且只有在不可能的情况下才会执行移动。

(并且,正如@BjornPollex所指出的那样,甚至很可能会省略此举)