C++标准:C++不允许修改任何基本型别(包括指针)的暂时值

从《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下面编译却没有问题。image

记住一点:右值不能被修改。

原文地址:https://www.cnblogs.com/VIPler/p/4319103.html