Cpp静态初始化与lambda表达式的结合


概述

全局变量初始化新姿势。

Lambda表达式

Lambda表达式是C++11引入的一个强大特性,它允许开发者在需要时定义匿名函数。Lambda表达式通常用于需要一个小型函数的地方,但又不想为此编写一个完整的函数定义。

语法

Lambda表达式的一般语法如下:

[capture] (parameters) -> return_type { function_body }
  • [capture]:捕获子句,可以捕获外部作用域的变量。
  • (parameters):参数列表,可以是空的,表示lambda没有参数。
  • -> return_type:返回类型,可以省略,由编译器根据函数体推断。
  • { function_body }:函数体。

捕获子句

Lambda可以捕获外部作用域的变量,捕获方式有:

  • 值捕获:[capture_value],将捕获的变量复制到lambda内部。
  • 引用捕获:[&capture_ref],将捕获的变量作为引用。
  • 隐式捕获:[=]表示按值捕获所有外部变量,[&]表示按引用捕获。

示例

int value = 10;
auto lambda = [value] { return value * 2; };

逗号表达式

逗号运算符允许在一个表达式中执行多个表达式,并且返回最后一个表达式的结果。这在需要执行一系列操作,但只关心最后一个操作结果时非常有用。

语法

逗号表达式的语法如下:

expression1 , expression2 , ... , expressionN
  • 每个expression都可以是任何有效的表达式。

用途

逗号表达式常用于初始化多个变量或在循环中更新多个循环控制变量。

如何初始化

static int abc=([]{
    //code here
}->void(),
    //init value
    0);

逗号左边的表达式是一个lambda表达式 ([]{}),它被立即调用 ([]{})(),返回值是 void是因为在C++中,void 类型的表达式在序列点上(比如逗号运算符的左边)会被隐式转换为 0。逗号右边的表达式 0 是一个整数值。

因此,整个初始化表达式 ([]{}(), 0) 实际上是执行了lambda表达式,然后返回了 0。由于 static int abc 需要一个整数值进行初始化,所以最终 abc 被初始化为 0。这种写法在某些情况下可以用于确保某个表达式被执行,即使它的结果不会被使用,比如用于调用一个函数以执行其副作用,然后使用逗号运算符来提供一个用于初始化的值。

static int abc = ([]()->int { return 1; }(), 0);
// 这里 abc 将被初始化为 1

为什么用的static,因为实际上在应用场景里面是帮助我们在main函数前使用,用staic可以省略额外去定义一个结构体或者类,然后在构造函数里面这些函数。但是他也并不是没有缺点的,比如如果是进行资源的初始化工作,那么这种写法只能帮助我们在main前面执行,而并不能帮助我们再main函数之后再执行回收工作。


文章作者: JoyTsing
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 JoyTsing !
评论
  目录