发布时间:2012-9-10 00:25
分类名称:C++
以下引自C++ Primer 3th
左值代表了一个可被程序寻址的对象,可以从该对象读取一个值,除非该对象被声明为const,否则它的值也可以被修改。右值只是一个表达式,它表示了一个值或一个引用了临时对象的表达式,用户不能寻址该对象也不能改变它的值。
从一个左值表达式所表示的对象中抽取值的动作就是一个从左值到右值的转换。
当一个函数期望一个按值传递的实参,而该实参又是一个左值的时候,就会执行从左值到右值的转换。(也就是先把实参的值用一个临时区域存储(抽取操作),然后将临时变量传递到函数中,这个抽取的操作中,临时变量就是右值,因为在代码中无法定位它的地址)。一个引用表示一个左值(因为引用的本义必须被赋值),所以当一个函数有一个引用参数时被调用的函数接受一个左值。因此,接受引用的函数中不会有从左值到右值的转换。
函数参数没有数组类型,取而代之的是参数被转换成指向数组首元素的指针。
前三种,统称为左值转换。
限定修饰转换只应用在指针指向的类型上。
extern void takeCI( const int ); // const value
int ii = ...;
takeCI(ii); // 无转换发生
extern void init( int *const ); // const pointer
extern int *pi;
init(pi); // 没有限制转换
函数转换被划分等级如下: