C++ const&的一个特性
最近在搜索类似scope exit的实现时,除了发现已经有人向标准委员会提出意见,还得到一些意外的C++特性,这个特性一直都存在,而且很有趣
http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/
总的来说就是:
1.局部作用域内,使用const&接收函数值返回时,函数的返回值(即右值、临时对象)会被const&直接引用,直到const&退出作用域时才析构,这是一个特殊的优化,避免多一次复制构造。这个const&可以理解为在一个const的右值引用。而一般情况下,函数返回值(即右值、临时对象)是在函数调用表达式之后就被析构。上述优化延迟了函数返回值(即右值、临时对象)的析构时间。
2.由于1的存在,所以下面的代码与直觉有差别
class base; // 注意,base没有虚析构函数
class derive : public base; // 注意,derive的析构函数不会被base的虚表派发
derive foo(); // 返回一个derive的函数
// 下面是某函数
void bar()
{
const base& b = foo();
// 作用域结束,derive的析构函数是会被调用的,而调用路径是derive::~derive,而不是base::~base virtual dispatch ~derive
}
出现这种行为的原因是,仅仅是因为const&接收了foo的返回值(即右值、临时对象),foo的返回值(即右值、临时对象)被延时析构。
而直觉上,我们觉得上述代码的行为,应该是这样:
derive d = foo();// 出现了一次复制构造,由foo的返回值(即右值、临时对象)构造左值d,之后foo的返回值(即右值、临时对象)析构
const base& b = d;// const&引用左值d,当退出作用域时,d::~derive
事实上:
1.编译器不是产生d,~derive只作用于foo的返回值(即右值、临时对象)
2.不要被base误导,因为这里的确有一个derive的值对象生成,作用域是函数bar,所以当bar返回后,这个derive对象就析构,自然就会调用~derive
C++ const&的一个特性的更多相关文章
- MVC4项目中验证用户登录一个特性就搞定
在开发过程中,需要用户登陆才能访问指定的页面这种功能,微软已经提供了这个特性. // 摘要: // 表示一个特性,该特性用于限制调用方对操作方法的访问. [AttributeUsage(Attribu ...
- 转:C4项目中验证用户登录一个特性就搞定
转:C4项目中验证用户登录一个特性就搞定 在开发过程中,需要用户登陆才能访问指定的页面这种功能,微软已经提供了这个特性. // 摘要: // 表示一个特性,该特性用于限制调用 ...
- OC中的一个特性:延展
OC中的一个特性:延展其实说白了,延展就是弥补C语言中的前向申明,我们知道,在C语言中,如果你想调用一个函数的话,那么在此之前必须要声明一个这个函数,就是有前置性.OC中为了弥补C语言中的这个问题,就 ...
- C#特性:从自定义一个特性开始,谈谈什么是特性
作为C#新手中的一员,我刚开始接触特性时,那真是一脸冏逼啊,怎么想怎么查资料都没弄明白它到底是个什么东西,有的入门教程甚至都没讲特性和反射这些概念!相信很多人第一次接触到特性就是关于系列化的知识了. ...
- form的一个特性
在一个form表单中,若只有一个input,按回车键表单会自动提交,但是当表单中存在多个input时,按回车键不会执行任何操作,这是form表单的一个特性
- [转]MVC4项目中验证用户登录一个特性就搞定
本文转自:http://www.mrhuo.com/Article/Details/470/A-Attribute-For-MVC4-Project-Used-To-Validate-User-Log ...
- Spring 5的最后一个特性版本5.3发布,4.3将于12月终止维护
10月27日,Spring Framework团队宣布了5.3版本正式GA,Spring用户可以在repo.spring.io和Maven Central上获取到最新版本的依赖包. JDK的版本支持 ...
- 泥鳅般的const(一个小Demo彻底搞清楚)
#include<stdio.h> int main(){ int a = 3; int b = 5; /* C标准库函数中最常见格式, 目的是保护參数, ...
- 我的新发现:AVL树旋转的一个特性
关于AVL树旋转的代码网络上铺天盖地. 一些经典的实现方法如下: AVLTree SingleLeftRotation(AVLTree A) { AVLTree B = A->left; A-& ...
随机推荐
- 再跟SQL谈一谈--基础篇
1.简介 2.DDL & DML 3.SELECT ①DISTINCT ②WHERE ③AND & OR ④ORDER BY 4.INSERT 5.UPDATE 6.DELETE 1. ...
- 关于ibatis进行物理游标分页
http://www.iteye.com/topic/136712 详细demo:参照http://www.kusoft.net 我的数据库是采用mssql2000 采用分页必定数据量比较大: 按照i ...
- PB中用回车键实现tab键的功能
先编辑控件的TabOrder顺序,然后在 global external functions 中定义一个API:Subroutine keybd_event(int bVk,int bScan,ulo ...
- 03_MySQL中文乱码处理_02_确保MySQL插入数据不乱码的解决方法
[要统一MySQL数据库客户端 和 服务端的字符集] 如下,就是不统一的情况: 通常,MySQL数据库的下面几个字符集(客户端 和 服务端)统一成一个字符集(即" show variable ...
- libsdl中文输入法候选列表不显示解决方案
libsdl输入中文时输入法不显示,将WM_IME_SETCONTEXT事件处理给注释即可. WM_IME_SETCONTEXT If the application draws the compos ...
- php安装过程中遇到的需要安装的问题
http://www.cnblogs.com/kristain/articles/3809243.html 借鉴php安装错误 2013-01-04 19:16:49 分类: 系统运维 环境: ...
- iOS面试题6.30总结
越来越多的人投入iOS这个行业中,但是作为刚才学校毕业的学生,我们没有任何经验.或者经验很少.但是这也不能阻挡我们对苹果的热情,想投入iOS的开发中.而作为进入企业的第一步,我们要参加面试.面试中我们 ...
- Sumbline编译Less
Less教程 Sublime Text 2的Less2Css插件介绍与安装 网址 http://fdream.net/blog/article/783.aspx 如果出现node.exe不是内部命令的 ...
- 玩转HTML5移动页面(动效篇)
原文:http://www.grycheng.com/?p=458 作为一名前端,在拿到设计稿时你有两种选择: 1.快速输出静态页面 2.加上高级大气上档次狂拽炫酷屌炸天的动画让页面动起来 作为一个有 ...
- delphi xe5 android 开发数据访问server端(二)
上一篇我们创建了一个拟给手机端访问的webservices服务 接下来创建一个返回数据集的过程,用webservices发布,供手机端调用.这里我使用firedac 1.打开上一篇自动创建的WebMo ...