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

转载于:https://www.cnblogs.com/zhanjindong/archive/2012/09/30/2839862.html

Gotchas 44-引用和临时对象相关推荐

  1. C++之临时对象、常引用和浅拷贝探究

      和结构体一样,一个类的对象也可以以值,指针或者引用的形式作为函数的参数或返回值.一般情况下,为了避免创建临时对象通常传对象的引用,并且为了避免在函数体内修改对象的值,通常使用常引用:     co ...

  2. 临时对象与NRV技术

    临时对象与NRV技术 <More Effective C++>中讲到,在C++中真正的临时对象是看不见的,它们不出现在你的源代码中.建立一个没有命名的非堆(non-heap)对象会产生临时 ...

  3. 提高C++性能的编程技术笔记:临时对象+测试代码

    类型不匹配:一般情况是指当需要X类型的对象时提供的却是其它类型的对象.编译器需要以某种方式将提供的类型转换成要求的X类型.这一过程可能会产生临时对象. 按值传递:创建和销毁临时对象的代价是比较高的.倘 ...

  4. C++对象模型9——临时对象的生命周期、模板及实例化分析、内联函数

    一.临时对象的生命周期 T c=a+b 假设T是一个类型,那么上述代码执行时,首先会产生一个临时对象用来存放a+b的结果(拷贝初始化临时对象),然后用该临时对象拷贝初始化c,最后临时对象被释放.如果开 ...

  5. C++编程进阶8(最好不要实现类型转换运算符、单形参的构造函数与类型转换、临时对象与RVO)

    二十九.最好不要实现类型转换运算符 示例代码 class fraction { public:fraction(int numerator=0, int denominator=1);operator ...

  6. Objective-C:MRC(引用计数器)获得对象所有权的方式(init、retain、copy等)

    .h声明文件 1 // Integer.h 2 // 02-MRC 3 // 4 // Created by ma c on 15/8/13. 5 // Copyright (c) 2015年. Al ...

  7. 探讨“临时对象”(temporary object)

    2019独角兽企业重金招聘Python工程师标准>>> MSDN中对VS2012版本的临时对象的说明如下: 在某些情况下,编译器有必要产生临时对象.     当初始化一个 常量引用 ...

  8. 侯捷-C++面向对象高级开发(操作符重载与临时对象)

    侯捷-C++面向对象高级开发(操作符重载与临时对象) 1.操作符重载与临时对象 任何成员函数有一个隐藏的this pointer指向,指向调用者. 传递者无需知道接收者是以什么形式接收 就比如下面方框 ...

  9. 【读书笔记】【程序员的自我修养 -- 链接、装载与库(三)】函数调用与栈(this指针、返回值传递临时对象构建栈、运行库与多线程、_main函数、系统调用与中断向量表、Win32、可变参数、大小端

    文章目录 前言 介绍 内存 内存布局 栈与调用惯例 堆与内存管理 运行库 入口函数和程序初始化 C/C++运行库 运行库与多线程 C++全局构造与析构 fread 实现 系统调用与API 系统调用介绍 ...

最新文章

  1. 如何在OpenCV中为InRange阈值选择颜色的最佳HSV值
  2. MYSQL交通系统查询,城市公交查询系统的设计与实现(SSH,MySQL)(含录像)
  3. 【pmcaff】一个APP的诞生,非技术人员的想法实现
  4. 高额奖金+实习机会+官方证书 丨微众银行第二届金融科技高校技术大赛正式启动...
  5. 【转】C# 操作系统防火墙
  6. 消息队列背后的设计思想
  7. Failed to install Tomcat7 service 解决
  8. 原博客文章(Apache初配2008/4/8)
  9. 【OSChina-MoPaaS应用开发大赛】豪美创新后台业务管理系统
  10. 支持Delphi2009/2010的DES加密单元
  11. 测试游戏帧率电脑温度的软件,游戏中显示帧数和温度方法_游戏画面中实时显示FPS帧数温度技巧...
  12. 【matlab 图像处理】双边滤波高斯滤波
  13. Spring ldap ODM
  14. Android开发:vivo企业开发者账号注册
  15. 机器学习学习笔记(3)——量纲与无量纲,标准化、归一化、正则化
  16. 2020牛客寒假算法基础集训营3——J.牛牛的宝可梦Go【最短路 DP(01背包) 复杂度优化】(附优化分析)
  17. Ajax和Json使用
  18. 新款Macbook Pro可以升级固态硬盘吗?
  19. java内存溢出监控_Java内存溢出和死锁的监控与分析
  20. 手机充电器电源适配器原理

热门文章

  1. LeetCode Simplify Path(栈操作)
  2. 优秀大数据GitHub项目一览
  3. concurrenthashmap在1.8和1.7里面有什么区别
  4. (cvpr2019 ) Better Version of SRMD
  5. 洛谷 P2574 XOR的艺术
  6. 别忘了在使用MES系统之前,还有关键一步!
  7. 缩进动画Scaleanimation的一个小示例
  8. Java复习-线程之间的通信与同步
  9. javascript笔记——点击按钮(或超链接)如何跳转到另外一个页面并执行目标页面的js函数...
  10. 数据仓库与数据挖掘的一些基本概念