• Gotchas 6对常量(性)的认识误区


    摘要:

    1)“字面常量没有地址,永远不能改变其值”③
    2)关于左值和右值得理解误区:
    左值并不是指能放在赋值号左边的值,右值自然也不是指能放到赋值号右边的。左值可以放在赋值号右边,但右值一定只能是在赋值号的右边。但左值也不一定能放在赋值号的左边:
    const int i;
    对于常量i是不能放在赋值号的左边的,但其的的确确是个左值,它是一个不能改变的左值。
    正确的理解是:左值是“能放置值得地方”,而右值就是没有与之相关的地址的值。
    3)关于常量性的理解:
    int i=10;
    const int *ip=&i;
    i=10;//没问题,约束的不是i的一般操作,而是通过ip对i的操作
    *ip=13;//错误
    “const这个修饰词描述了通过ip对i的操作约束,而不是对i一般操作的约束”①
    “这里我们就有了一个指向const int类型的指针,而这个const类型对象又是一个普通的int类型对象的引用。这里的常量性仅仅限制了我们能通过ip做什么。这不表明i不会变,只是对它的修改不能通过ip进行。如果我们把问题说的再详细一点,请看下面这个把const和volatile结合使用的例子:
    extern const volatile time_t clock;
    这个const修饰词表面我们未被允许(在代码中显示的直接的)修改ckock的值,但是同时存在volatile修饰词说明clock肯定还是会通过其他途径发生变化”②
    =======================================================
    注释:
    ①译注:也就是说变量本身不具有常量性,具有常量性的是通过指针反引用的那个能够作为左值得表达式(*ip),虽然这两者从观念上来看,是同一个对象。这就让我们理解,C++常量性不是根据低级地址绑定的,而是富有高级的对象观念的。
    ②译注:这个例子说明了C++中的常量性的观念只限制了在代码中对const修饰的变量显示的直接修改,对于其他方式修改,并不是C++语言的常量性的要求。总体来看本文指出了常量性是高级操作。
    =======================================================
    个人理解:
    对于③的理解:
    int &i=12;//错误,“引用必须以左值来初始化”→常见错误44:引用和临时对象
    const int &i2=12;//正确,编译器会声明一个临时对象
    但是不要试图通过下面的方式改变字面常量12的值:
    const_cast<int &>(i2)=11;//赋值给那个匿名临时对象,或者程序直接崩溃。
    =========================================================
    See Also
    常见错误44:引用和临时对象

  • 相关阅读:
    SSH的基本操作
    Aptana Studion出现 duplicate location重复定位报错
    centOS6.6虚拟机启动后登陆界面无法显示
    putty的基本使用
    Linux之如何进行固定IP、DNS等设置
    \无法访问。您可能没有权限使用网络资源。请与这台服务器的管理员联系以查明您是否有访问权限。找不到网络路径。解决方法和思路。
    访问共享时提示“你没有权限访问\192.168.0.100共享盘”解决方法?
    ESXI问题汇总
    【亲测】使用U盘安装ESXI6.7全过程以及遇到的问题记录
    U盘安装EXSi6.7出错menu.c32文件
  • 原文地址:https://www.cnblogs.com/zhanjindong/p/2839859.html
Copyright © 2020-2023  润新知