最近在搜索类似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&的一个特性的更多相关文章

  1. MVC4项目中验证用户登录一个特性就搞定

    在开发过程中,需要用户登陆才能访问指定的页面这种功能,微软已经提供了这个特性. // 摘要: // 表示一个特性,该特性用于限制调用方对操作方法的访问. [AttributeUsage(Attribu ...

  2. 转:C4项目中验证用户登录一个特性就搞定

    转:C4项目中验证用户登录一个特性就搞定   在开发过程中,需要用户登陆才能访问指定的页面这种功能,微软已经提供了这个特性.     // 摘要:    //     表示一个特性,该特性用于限制调用 ...

  3. OC中的一个特性:延展

    OC中的一个特性:延展其实说白了,延展就是弥补C语言中的前向申明,我们知道,在C语言中,如果你想调用一个函数的话,那么在此之前必须要声明一个这个函数,就是有前置性.OC中为了弥补C语言中的这个问题,就 ...

  4. C#特性:从自定义一个特性开始,谈谈什么是特性

    作为C#新手中的一员,我刚开始接触特性时,那真是一脸冏逼啊,怎么想怎么查资料都没弄明白它到底是个什么东西,有的入门教程甚至都没讲特性和反射这些概念!相信很多人第一次接触到特性就是关于系列化的知识了. ...

  5. form的一个特性

    在一个form表单中,若只有一个input,按回车键表单会自动提交,但是当表单中存在多个input时,按回车键不会执行任何操作,这是form表单的一个特性

  6. [转]MVC4项目中验证用户登录一个特性就搞定

    本文转自:http://www.mrhuo.com/Article/Details/470/A-Attribute-For-MVC4-Project-Used-To-Validate-User-Log ...

  7. Spring 5的最后一个特性版本5.3发布,4.3将于12月终止维护

    10月27日,Spring Framework团队宣布了5.3版本正式GA,Spring用户可以在repo.spring.io和Maven Central上获取到最新版本的依赖包. JDK的版本支持 ...

  8. 泥鳅般的const(一个小Demo彻底搞清楚)

    #include<stdio.h> int main(){     int a = 3;     int b = 5;          /* C标准库函数中最常见格式, 目的是保护參数, ...

  9. 我的新发现:AVL树旋转的一个特性

    关于AVL树旋转的代码网络上铺天盖地. 一些经典的实现方法如下: AVLTree SingleLeftRotation(AVLTree A) { AVLTree B = A->left; A-& ...

随机推荐

  1. Tomcat6.0数据库连接池配置

    http://blog.163.com/magicc_love/blog/static/185853662201111101130969/ oracle驱动包Tomcat 6.0配置oracle数据库 ...

  2. 自动生成get,set方法

    引发的问题: Action中有一个属性名字叫private boolean isHideNumber 用struts2的<s:if test ="isHideNumber"& ...

  3. oc ios 中文字符串 进行 sha1加密 错误?

    我在网上找到了一个oc版加密的工具类,但是加密中文就出现大问题 const char *cstr = [self cStringUsingEncoding:encoding]; NSData *dat ...

  4. 查内网虚拟机映射的公网IP

    1.访问ip138.com 2.curl ifconfig.me

  5. Moving Tables

    Moving Tables Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total ...

  6. dp方程

    1.        资源问题1 -----机器分配问题 F[I,j]:=max(f[i-1,k]+w[i,j-k]) 2.        资源问题2 ------01背包问题   F[I,j]:=ma ...

  7. WP8手机解锁时提示“请确保IPOVERUSBSVC服务正常运行”解决方法

    如果你各种重启服务 卸载手机 重装驱动都试过了还不行,请看看你是否安装了Hyper-v或Vitualbox虚拟机,很有可能是虚拟交换机造成的. 我在网络连接属性里看到这个 把它卸载后,解锁成功. 解锁 ...

  8. 切割TOMCAT日志

    tomcat的catalina.out日志如果不做操作的话,日志就会日积月累的不断增加.我刚入职的时候发现某台服务器的硬盘报警,排查之后我慌了,一个tomcat的日志居然有100G,这怎么可以,在网上 ...

  9. mini2440 MJPG_STREAMER 产生问题

    usb摄像头芯片是中芯微的zc0301pl, http://www.vimicro.com.cn/product/pdf/ZC301PL-1107-V10-EN.pdf [root@FriendlyA ...

  10. windows平台 culture name 详细列表

    点击打开链接http://msdn.microsoft.com/zh-cn/goglobal/bb896001.aspx LCID Culture Identifier Culture Name Lo ...