[英]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.