左值与右值

今天在编译下面一段代码的时候,Compare(1,2)编译不通过

int Compare(T &v1, T &v2)

{
  if(v1 < v2) return -1;
  if(v2 < v1) return 1;
  return 0
}
int main()
{
  Compare(1,2);
}

但是修改下Compare函数为

int Compare(const T&v1, const T &v2)后,能正常编译通过。

失败的原因是非常量引用的初始值必须为左值。

什么是左值和右值?

C/C++语言中可以放在赋值符号左边的变量,左值表示存储在计算机内存的对象,左值相当于地址值。右值:当一个符号或者常量放在操作符右边的时候,计算机就读取他们的“右值”,也就是其代表的真实值,右值相当于数据值。

也就是说,左值必须是计算机能找到地址的值。

如:

int na,nb;

na = 0;

na,nb是左值,这两个符号代表的是他在计算机中的地址,而0是右值。

但是左值和右值不是绝对的,左值可以是右值,但右值不一定可以成为左值。

如:

na = nb; //nb在这里作为右值

0 = na; //错误,因为编译器无法判断0的内存地址,所以0不能作为左值。

那为什么代码前面加个const,Compare(1,2)就能通过呢?

经过搜索,经过const修饰的“变量”,是不可修改的,也就是有地址可寻,所以可以作为左值使用。

posted @ 2014-04-19 23:06  充满正能量  阅读(253)  评论(0)    收藏  举报