从《C++标准库》一书中看到这样一句话:C++不允许修改任何基本型别(包括指针)的暂时值,想了半天,实在不理解。基本类型char,int,float等等还有暂时值?例如int a=2,那么这个a的暂时值是哪个呢?我能不能把2理解为a的暂时值?如果2为暂时值,显然不行,因为你根本无法修改2,那么那句话就毫无意义了。暂时值先不管了,不知道怎么找,搜了很多,明白一个大概意思,先看几个从网上找到的例子:
#include<iostream> using namespace std; void main() { int a = 4; a++ = 5; int *b; *b = 4; *b++ = 5; }
a++;
后缀++ 返回的是一个(临时的)右值,其值是a的原值, 不能被赋值。(注意,这里说的是右值)
*b++ = 5;
该表达式是 *(b++) = 5;
也就是先对指针加1, 再解引用。
b++ 同a++一样, 是一个临时的右值,(其值是b的原值), 不能被赋值, 比如下面的代码不合法:
b++ = ptr;
b++表达式产生的是一个临时的指针值, 对指针解引用(当然,该值必须指向合法位置)之后, 就是一个左值了,所以:
*b++ = 5; 就是合法的。
再看一个例子;
#include <iostream> using namespace std; class my { public: my(int j=0):i(j){} int i; void operator=(my&out)//这里重定义一个赋值操作符=,为下面的赋值做准备。 { i=out.i; } }; my fun() { my temp(1); return temp;//这里返回一个类的临时变量 } int fun2() { int a; return a;//这里返回一个普通int临时变量 } int main() { my out(2); fun()=out; //这里可以对类的临时变量赋值 fun2()=3; //但是这里对普通int类型的变量就会出错 }
fun2()返回的是一个右值,不能赋值,只能这么解释了。
再看《C++标准库》提到的问题:
vector<int> coll; ..... sort(++coll.begin(),coll.end());
书上说会编译失败。我在VS2012下面编译却没有问题。
记住一点:右值不能被修改。
时间: 2024-11-01 00:32:53