在c 11中使用rvalue引用

前端之家收集整理的这篇文章主要介绍了在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知道什么时候隐含地移动东西是安全的.通过值而不是通过引用返回值,或者总是一个安全的移动时间.因此,它会移动.

猜你在找的C&C++相关文章