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对象来处理。

你可能感兴趣的:(学习,c++)