右值引用形式:类型 && a= 被引用的对象。
与左值引用&的区别在于:右值是临时变量, 可理解为右值的引用,右值初始化后临时变量消失。
从实践角度讲,它能够完美解决C++中长久以来为人所诟病的临时对象效率问题。从语言本身讲,它健全了C++中的引用类型在左值右值方面的缺陷。从库设计者的角度讲,它给库设计者又带来了一把利器。从库使用者的角度讲,不动一兵一卒便可以获得“免费的”效率提升…
在标准C++语言中,临时量(术语为右值,因其出现在赋值表达式的右边)可以被传给函数,但只能被接受为const &类型。这样函数便无法区分传给const &的是真实的右值还是常规变量。而且,由于类型为const &,函数也无法改变所传对象的值。C++0x将增加一种名为右值引用的新的引用类型,记作typename &&。这种类型可以被接受为非const值,从而允许改变其值。这种改变将允许某些对象创建转移语义。比如,一个std::vector,就其内部实现而言,是一个C式数组的封装。如果需要创建vector临时量或者从函数中返回vector,那就只能通过创建一个新的vector并拷贝所有存于右值中的数据来存储数据。之后这个临时的vector则会被销毁,同时删除其包含的数据。有了右值引用,一个参数为指向某个vector的右值引用的std::vector的转移构造器就能够简单地将该右值中C式数组的指针复制到新的vector,然后将该右值清空。这里没有数组拷贝,并且销毁被清空的右值也不会销毁保存数据的内存。返回vector的函数现在只需要返回一个std::vector<>&&。如果vector没有转移构造器,那么结果会像以前一样:用std::vector<> &参数调用它的拷贝构造器。如果vector确实具有转移构造器,那么转移构造器就会被调用,从而避免大量的内存分配。
本博客所有内容是原创,如果转载请注明来源
http://blog.csdn.net/myhaspl/
右值引用
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//code:http://blog.csdn.net/myhaspl
#include "stdafx.h"
#include <iostream>
using std::endl;
using std::cout;
using std::cin;
class Mypoint{
public:
int n_x = 0;
int n_y = 0;
//code:http://blog.csdn.net/myhaspl
Mypoint(int x, int y) {
n_x = x;
n_y = y;
cout << n_x << "," << n_y;
cout << " create!" << endl;
}
Mypoint(const Mypoint &myp) {
n_x = myp.n_x;
n_y = myp.n_y;
cout << n_x << "," << n_y;
cout << " 拷贝构造函数调用!" << endl;
}
Mypoint(Mypoint &&myp) {
n_x = myp.n_x;
n_y = myp.n_y;
cout << n_x << "," << n_y;
cout << " move拷贝构造函数调用!" << endl;
}
~Mypoint() {
cout << n_x << "," << n_y;
cout << " delete!" << endl;
}
};
int mydistance(const Mypoint &p1, const Mypoint &p2) {
cout << "Mypoint& distance!" << endl;
return static_cast<int>(sqrt((p2.n_x - p1.n_x)*(p2.n_x - p1.n_x) + (p2.n_y - p1.n_y)*(p2.n_y - p1.n_y)));
}
int mydistance(Mypoint &&p1, Mypoint &&p2) {
cout << "Mypoint&& distance!" << endl;
return static_cast<int>(sqrt((p2.n_x - p1.n_x)*(p2.n_x - p1.n_x) + (p2.n_y - p1.n_y)*(p2.n_y - p1.n_y)));
}
int main()
{
int x = 10;
int y = 100;
char temp = ‘ ‘;
int &xleftptr = x;
xleftptr = 20;
cout << xleftptr << endl;
Mypoint myp1= Mypoint(10,20);
Mypoint myp2 = Mypoint(100, 200);
Mypoint myp3 = Mypoint(88, 99);
Mypoint lp3 = myp3;
Mypoint &lp1 = myp1;
Mypoint &lp2 = myp2;
//---左值引用
cout << "左值引用result:" << mydistance(myp1, myp2) << endl;
//---右值引用
cout <<"右值引用result:" << mydistance(Mypoint(110, 220), Mypoint(1100, 2200)) << endl;
cin >> temp;
return 0;
}
本博客所有内容是原创,如果转载请注明来源
http://blog.csdn.net/myhaspl/
20
10,20 create!
100,200 create!
88,99 create!
88,99 拷贝构造函数调用!
Mypoint& distance!
左值引用result:201
1100,2200 create!
110,220 create!
Mypoint&& distance!
右值引用result:2213
110,220 delete!
1100,2200 delete!