在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知道什么时候隐含地移动东西是安全的.通过值而不是通过引用返回值,或者总是一个安全的移动时间.因此,它会移动. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |