BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #90323同步于 2016/2/22
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

C++ 0x11 中 const string && 中 "&&" 的意思是?

epico
2016/2/22镜像同步5 回复
最近,在用 gcc 6.0 编译程序时,报错: 无法将 "const string" 转化为 "const string &&"... 想请教一下: "&&" 在这里的意思是?
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
epico机器人#1 · 2016/2/22
相关文档: http://en.cppreference.com/w/cpp/utility/pair/make_pair
myjfm机器人#2 · 2016/2/22
你需要了解左值和右值的概念 简单来说,不具名的变量都是左值,具名的变量都是右值 string&&中的&&,就是接受string右值类型 那有什么好处呢,右值明确告诉编译器,这个值,函数调用完事之后我就不用了,所以函数内部可以直接使用该右值的存储空间来挪作他用。 比如对函数foo(string&& t)来说 如果你了解string的实现,它内部有个指针,指向一块儿内存,那么,对右值来说,这块内存你可以重用,比如在函数内部,你需要copy构造一个t的副本,那么你可以直接挪用t指向的内存空间,不需要一次额外的内存分配,从而提高了效率,但是developer需要知道,该函数调用之后,t不再是一个有效的string 发自「贵邮」
nuanyangyang机器人#3 · 2016/2/22
【 在 epico 的大作中提到: 】 : 最近,在用 gcc 6.0 编译程序时,报错: : 无法将 "const string" 转化为 "const string &&"... : 想请教一下: "&&" 在这里的意思是? 看这个吧:这个对lvalue、prvalue、xvalue解释得比较清楚。http://en.cppreference.com/w/cpp/language/value_category rvalue reference(&&)主要是”从要死的对象手里抢资源“用的。比如一个函数返回一个临时vector,但vector里有一个指向堆里面的大数组的指针。如果用传统的copy语义,就要先拷贝一份这个大数组,然后让那个返回的vector自己销毁。但有了rvalue reference,它可以”抓住“这个要死的vector,趁它死之前把它里面的数组拿出来,等它不再拥有数组了,再让它死。这样做比copy便宜。所以,下面这种写法也是可以的: vector<int> make_vecotor() { vector<int> foo = {1,2,3,4,5,6,7,8,9,10}; return foo; } int main() { vector<int> bar = make_vector(); } main里的等号赋值,并不会把1到10都拷贝一遍,而是”掠夺“make_vector返回的那个要死的foo的内容。 vector的赋值有两种: vector& operator=( const vector& other ); vector& operator=( vector&& other ); 前者是拷贝的,后者是移动的。在上面的例子里,因为c++编译器知道make_vector函数的返回值是要死的,所以它会选用那个能够引用要死的值的rvalue reference,即第二种。但是,如果编译器不知道你想让某个vector死,它还会copy的。 vector a = {1,2,3,4,5,6,7,8,9,10}; vector b = a; // 拷贝。因为a是左值,所以会选用第一个const vector&的=运算符。 vector c = move(a); // 移动。move(a)其实就是static_cast<vector&&>(a),强行把它变成rvalue。这样做,a会被破坏。 建议看看Rust语言。Rust的move语义比C++做得还好。它的数据类型默认就是move语义的,除了基本类型(如整数)之外。
xiaobing307机器人#4 · 2016/2/22
右值引用
epico机器人#5 · 2016/2/23
非常感谢,学习了。看文档中 :-)