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

  • 相关阅读:
    GitLab 介绍
    git 标签
    git 分支
    git 仓库 撤销提交 git reset and 查看本地历史操作 git reflog
    git 仓库 回退功能 git checkout
    python 并发编程 多进程 练习题
    git 命令 查看历史提交 git log
    git 命令 git diff 查看 Git 区域文件的具体改动
    POJ 2608
    POJ 2610
  • 原文地址:https://www.cnblogs.com/zhanjindong/p/2839862.html
Copyright © 2011-2022 走看看