zoukankan      html  css  js  c++  java
  • Gotchas 44引用和临时对象

    摘要:
    1)“引用必须用左值来初始化”基本上着意味着引用的初始化物必须具有一个地址,也有一个值(→常见错误6)。不过谈及指向常量的引用时,事情就开始变得复杂了。指向常量的引用仍然必须用左值来初始化,不过编译器很乐意——在特定的情况下——为此从一个非左值出发来创建一个左值(临时对象):
    const int &r3=12;//没问题
    引用r3指向编译器隐式分配内存并创建的匿名int类型对象。一般情况下,这种编译器的生存期持续到权表达式结束处①。不过“在这种特例下,标准网开一面,保证临时对象会和以其为初始化物的引用共存亡”。“请注意该对象与以其为初始化物的引用之间并无联接纽带”。②
    2)“编译器还会为身为左值的初始化物产生临时对象。并与这个引用(声明时)指向的类型不一样:”
    const string &name="Fread";//没问题
    short s=123;
    const int &r4=s;//没问题
    s=345;//r4的值仍是123③
    const int *ip=&r4;//并非s的地址
    “此处的初始化物只是个临时的匿名对象,而非源代码中显示写明的那个变量。”
    =====================================================
    注释:
    ①参看string类的c_str成员函数的用法。
    ②万幸下面这段居心叵测的代码不会改变字面常量12的意义:
    const_cast<int &>(r3)=11;//赋值给那个匿名对象或程序直接崩溃。
    ③const int类型的引用r4关联的只是那个编译器创建的临时对象

  • 相关阅读:
    java前三章总结
    Java入门第二章
    MYSQL 3306设置允许外网访问
    Lnmp Laravel搭建网站需要注意的几点:
    Linux 如何删除网站目录下的user.ini
    Linux Composer的安装
    lnmp切换PHP版本
    解决GitHub的raw.githubusercontent.com无法连接问题
    Linux 7系列默认不能连网的解决办法
    lnmp安装
  • 原文地址:https://www.cnblogs.com/zhanjindong/p/2839862.html
Copyright © 2011-2022 走看看