繁体   English   中英

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

[英]Will returning a vector<vector <int> > from a function invoke any move constructors in C++11

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

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

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

return语句由标准明确涵盖,以自动视为移动。 所以是的,这将调用移动构造函数。

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

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

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

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

(强调我的)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM