Effective Modern C++ 学习记录8.29

1.条款五 名词:闭包(closure)

闭包有很多种定义,一种说法是,闭包是带有上下文的函数。说白了,就是有状态的函数。

参考:C++的闭包(closure) - 知乎 (zhihu.com)

effective modern C++ (P11):通过lambda表达式创造的函数对象通常称之为闭包(closure)

条款五原文:Okay, simple joy (take three): the delight of declaring a local variable whose type is that of a closure. Oh, right. The type of a closure is known only to the compiler, hence can’t be written out. Sigh. Damn.

翻译1:好吧,有三个令人愉悦的地方:声明一个封装好的局部变量的类型带来的快乐。是的,这是 没有问题的。一个封装体的类型只有编译器知道,因此不能被显示的写出来。哎,见鬼。

翻译2:好吧,再来个天真无邪的(事不过三),用闭包的型别来声明局部变量。不过,闭包的型别只有编译器晓得,所以写不出来呢。唉,我的天啊!
 个人理解:闭包就是带有很多信息的一个变量(对象)

2.条款九 名词: 依赖类别(dependent type)

条款九原文:the names of dependent types must be preceded by type name.

在依赖类型的名称之前必须冠以 typename 。

使用 using 别名模板就没事。

3.条款十四noexcept
开解调用栈
  • 概念:try中throw抛出的异常,后面若没有相对应匹配的catch语句块,则将异常传递给外层try匹配的catch语句处理,如果还是找不到匹配的catch,则退出当前的函数,将异常传递给当前函数的外层函数继续寻找。(外层函数指调用此try、catch组合的所在函数的函数),若一直传到main函数,main函数也处理不了,则程序就会调用标准库函数terminate,此函数将终止程序的执行
  • 我们知道,语句块在结束之后,块内的局部对象会自动销毁
  • 栈展开中也是如此,如果栈展开中退出了某个块,代表该块生命周期已经结束,语句块中的局部对象也会被销毁(自动调用析构函数)

在带有noexcept声明的函数中,优化器不需要在异常传出函数的前提下,将执行期栈保持在可开解状态;也不需要在异常溢出函数的前提下,保证所有其中的对象以其析构函数的顺序的逆序完成析构。 

怎么理解 “noexcept声明是函数接口的组成部分,这意味着调用方可能会对它有依赖”?

noexcept声明是函数接口的一部分,函数调用方(即调用该函数的代码)可能会依赖于这个声明。换句话说,调用方可能会基于函数是否声明为noexcept来进行一些决策或采取特定的行为。

如果一个函数被声明为noexcept,调用方可以依赖于这个声明,因为它保证了函数不会抛出异常。这使得调用方能够在代码中进行一些优化或假设,例如省略某些异常处理逻辑或者使用更高效的路径。

然而,如果调用方对一个被标记为noexcept的函数有依赖,而实际上该函数在运行时抛出了异常,那么这个依赖可能会导致未定义的行为。

 什么时候使用noexcept?

以下情形鼓励使用noexcept:

  • 移动构造函数(move constructor)
  • 移动分配函数(move assignment)
  • 析构函数(destructor)。
  • 叶子函数(Leaf Function)。叶子函数是指在函数内部不分配栈空间,也不调用其它函数,也不存储非易失性寄存器,也不处理异常。
4.条款16  

在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。

不加mutable,在const函数里的对象会当作const对象来处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值