• 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关联的只是那个编译器创建的临时对象

  • 相关阅读:
    C语言学习笔记<九>
    C语言学习笔记<六>
    C语言学习笔记<八>
    C语言学习代码〈五〉
    C语言学习笔记<七>
    红队笔记横向移动总结
    pikachu通关
    java线程监控
    项目空负载服务器使用cpu过高
    @NotBlank注解使用不生效的解决办法
  • 原文地址:https://www.cnblogs.com/zhanjindong/p/2839862.html
Copyright © 2020-2023  润新知