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