modern C++实现 golang 的defer
关于RAII的一些思考。
defer 的简介
注:没有 golang 语法基础的读者可以看看,反之,可以跳过。
golang语法中的defer
是什么?
defer用来声明一个延迟函数,把这个函数放入到一个栈上, 当外部的包含方法return之前,返回参数到调用方法之前调用,也可以说是最外层方法体执行结束时调用。
举一个简单的例子,在函数test()
中用defer
声明在函数结束后执行打印Exit function -> test()
。
package main
import "fmt"
func test() {
defer fmt.Println("Exit function -> test()")
fmt.Println("Enter function -> test()")
}
func main() {
test()
}
执行结果:
Enter function -> test()
Exit function -> test()
涉及 modern C++ 语法简介
auto
C++11标准之前的是auto
含义的分割线,之前的auto
没有什么实际的含义,仅仅代表除了static
之外的存储属性。之后的auto
用于编译器自动推导变量类型,用auto初始化的变量编译器会自动推导其类型。
需要注意的是:
-
用
auto
定义变量的时候没有缺省值。下面这样的代码就会报错:auto value;
-
auto
定义的变量第一次推导出变量的类型就不会在自动更改,比如下面这样的代码编译器就会有警告:auto value = 10; value = 1.2; // Warning: implicit conversion from 'double' to 'int' // changes value from 1.2 to 1
几个小例子:
注:读者感兴趣的话,请自行在MSVC编译器下编译,因为MSVC编译出的这段代码可视性能好一点。博主刚把MSVC卸载了,暂时也没有windows下的C/C++编译环境。
#include <iostream>
#include <typeinfo>
// 读者先不必理会这是个什么东西,这个只是用来打印分割线的
auto divider = [] {
for(auto i = 0; i < 10; ++i) std