加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在c 11中使用rvalue引用

发布时间:2020-12-16 04:59:17 所属栏目:百科 来源:网络整理
导读:我想实现一个填满向量的函数,然后返回一个rvalue引用.我累了一些东西: std::vectorint fill_list() { std::vectorint res; ... do something to fill res ... return res;}int main(int argc,char **argv) { std::vectorint myvec = fill_list(); return 0;
我想实现一个填满向量的函数,然后返回一个rvalue引用.我累了一些东西:
std::vector<int> &&fill_list() {
  std::vector<int> res;
  ... do something to fill res ...
  return res;
}

int main(int argc,char **argv) {
  std::vector<int> myvec = fill_list();
  return 0;
}

但是这不行,我得到以下错误:

error: invalid initialization of reference of type 'std::vector<int>&&' from expression of type 'std::vector<int>'

所以,总而言之,正确的做法如何?我不认为我还得到rvalue参考.

解决方法

你似乎对什么是rvalue引用是混淆的,以及它如何与移动语义相关联.

第一件事:&&&不意味着移动.它只不过是一种特殊的参考类型.它仍然是一个参考.这不是一个价值;它不是一个移动的价值;它是一个值的参考.这意味着它具有参考类型的所有限制.值得注意的是,它必须引用仍然存在的值.所以返回一个悬挂的r值引用不如返回一个悬挂的l值引用.

“移动”是使一个对象声称拥有另一个对象的内容的过程. R值参考有助于移动语义,但只是具有&&并不意味着任何事情都发生了变化.移动仅在调用移动构造函数(或移动赋值运算符)时发生;除非这两件事之一被召唤,否则没有发生任何动作.

如果您希望将std :: vector的内容从您的函数中移出给用户,那么您只需执行以下操作:

std::vector<int> fill_list() {
  std::vector<int> res;
  ... do something to fill res ...
  return res;
}

给定这个fill_list()的用法:

std::vector<int> myvec = fill_list();

其中一件事情会发生.返回将被消除,这意味着不会发生复制或移动. res直接构建到myvec中.或者res将被移动到返回值中,然后执行myvec的移动初始化.所以再没有复制.

如果你有这个:

std::vector<int> myvec;
myvec = fill_list();

再次,它会被移入.没有复制.

C 11知道什么时候隐含地移动东西是安全的.通过值而不是通过引用返回值,或者总是一个安全的移动时间.因此,它会移动.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读