左值与右值
今天在编译下面一段代码的时候,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修饰的“变量”,是不可修改的,也就是有地址可寻,所以可以作为左值使用。

浙公网安备 33010602011771号