• 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

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

  • 相关阅读:
    React.js自学第一天
    优化的34条定律
    JS 打字机效果
    css3 翻书效果
    对象操作
    表单提交验证
    封装cookie组件
    iOS中为网站添加图标到主屏幕
    教你从Win8换回Win7
    关于VB中Print函数在数组中换行的理解
  • 原文地址:https://www.cnblogs.com/VIPler/p/4319103.html
Copyright © 2020-2023  润新知