左值与右值理解误区

2013年4月19日 由 Creater 留言 »

在标准C++语言中,临时量(术语为右值,因其出现在赋值表达式的右边)可以被传给函数,但只能被接受为const &类型。这样函数便无法区分传给const &的是真实的右值还是常规变量。而且,由于类型为const &,函数也无法改变所传对象的值。C++0x将增加一种名为右值引用的新的引用类型,记作typename &&。这种类型可以被接受为非const值,从而允许改变其值。
比如:

int &a = 1;
const int &b = 1;

第一行出错,用类型为‘int’的右值初始化类型为‘int&’的非常量引用无效。
第二行则正确。

对左值和右值的一个最常见的误解是:等号左边的就是左值,等号右边的就是右值。
左值和右值都是针对表达式而言的,左值是指表达式结束后依然存在的持久对象,右值是指表达式结束时就不再存在的临时对象。一个区分左值与右值的便捷方法是:看能不能对表达式取地址,如果能,则为左值,否则为右值。下面给出一些例子来进行说明。
int a = 10;
int b = 20;
int* pFlag = &a;
vector vctTemp;
vctTemp.push_back(1);
string str1 = “hello “;
string str2 = “world”;
const int &m = 1;
请问,a,b, a+b, a++, ++a, pFlag, *pFlag, vctTemp[0], 100, string(“hello”), str1, str1+str2, m分别是左值还是右值?bf096b63f6246b6040f07b9eebf81a4c500fa25a

广告位

发表评论

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