左值引用,右值引用

2013年4月19日 由 Creater 留言 »

左值引用根据其修饰符的不同,可以分为非常量左值引用(int &r =i;)和常量左值引用(const int &r =i;)。
11
非常量左值引用只能绑定到非常量左值,不能绑定到常量左值、非常量右值和常量右值。如果允许绑定到常量左值和常量右值,则非常量左值引用可以用于修改常量左值和常量右值,这明显违反了其常量的含义。如果允许绑定到非常量右值,则会导致非常危险的情况出现,因为非常量右值是一个临时对象,非常量左值引用可能会使用一个已经被销毁了的临时对象。
常量左值引用可以绑定到所有类型的值,包括非常量左值、常量左值、非常量右值和常量右值。
右值引用根据其修饰符的不同,也可以分为非常量右值引用和常量右值引用。
非常量右值引用只能绑定到非常量右值,不能绑定到非常量左值、常量左值和常量右值(VS2010 beta版中可以绑定到非常量左值和常量左值,但正式版中为了安全起见,已不允许)。如果允许绑定到非常量左值,则可能会错误地窃取一个持久对象的数据,而这是非常危险的;如果允许绑定到常量左值和常量右值,则非常量右值引用可以用于修改常量左值和常量右值,这明显违反了其常量的含义。
常量右值引用可以绑定到非常量右值和常量右值,不能绑定到非常量左值和常量左值(理由同上)。可以看出,使用左值引用时,我们无法区分出绑定的是否是非常
来看下面的代码:

#include
using namespace std;
template
int compare(T &a,T &b)
{
	if(a < b) return 1;
	else if( b < a) return -1;
	else return 0;
}

int main()
{
	cout<<compare(1,2)<<endl;
	cout<<compare("456","123")<<endl;
	cout<<compare("4567","123")<<endl;
}

cout<<compare(1,2)<<endl;这个出错,原因是1,2都是常量右值,也即是作为参数传递时会产生两个临时变量,临时变量不能绑定到引用。
cout<<compare(“456″,”123”)<<endl;这个正确的原因是,“456”,“123”为常量文本,会存放在常量区。
cout<<compare(“4567″,”123”)<<endl;出错的原因,一个参数为const char[5],一个参数为const char[4],模板不能生成对于的函数。
由第二和第三可以看出,当模板函数的参数为引用时,传递字符串常量并不是传递指针,而是传递整个数组。

再看下面:

const int &a = 1;
char *const &p ="456";
int &b = 1;
char *&p1 = "456";

前两个正确,后两个则错误。
修改成

int compare(const T &a,const T &b)
{
	if(a < b) return 1;
	else if( b < a) return -1;
	else return 0;
}

也是可以的。

广告位

发表评论

你必须 登陆 方可发表评论.