微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在c 11中使用rvalue引用

我想实现一个填满向量的函数,然后返回一个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知道什么时候隐含地移动东西是安全的.通过值而不是通过引用返回值,或者总是一个安全的移动时间.因此,它会移动.

原文地址:https://www.jb51.cc/c/115082.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐