"static char __ = []() -> char"的含义

The meaning of "static char __ = []() -> char"

本文关键字:char gt static      更新时间:2023-10-16

我从LeetCode问题的几个解决方案中看到了代码。

static char __ = []() -> char {
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
std::cout.tie(NULL);
return ''; }();

我知道以下行用于快速 I/O。

std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
std::cout.tie(NULL);

但是,我不知道

static char __ = []() -> char {
// fast IO
return ''; }();

有人可以解释代码的含义吗?

[]() -> char { ... }是一个不带输入并返回char的lambda。

lambda 后面的()正在调用它,就像任何其他函数调用一样。

lambda 返回的char值正在分配给名为__的静态变量。

由于变量是static的,它只会被初始化一次,所以lambda只会被调用一次。

请参阅此答案 在 c++ 中是否有更好的方法一次性执行一组代码而不是使用静态变量检查

此代码:[]() -> char { return ''; }()

是一个调用未命名的 lambda 函数的表达式。实际上,它包含一些多余的元素,并且可以写[]{ return ''; }()。由于 lambda 中的空参数列表可以省略,并且可以从return语句中的表达式推导出返回类型。

代码非常类似于:

char qux() { return ''; }
char __ = qux();

除了不需要标识符qux,因此减少了与程序使用的其他标识符发生冲突的机会。

命名变量__会导致未定义的行为,因为包含双下划线的名称保留给实现,因此此代码最好使用一些有效的标识符,如果发生冲突,可以通过未命名的命名空间隐藏该标识符。


此代码的目的是在main()运行之前执行函数体。 让这段代码出现在main()的第一行会更干净,但也许作者担心可能还有其他一些代码也在main()之前运行并依赖于这些语句的执行。

然而,这种方法并不能真正解决问题,因为就好像所说的其他语句在不同的翻译单元中一样,不能保证__的初始化发生在另一个单元的静态初始化之前。请参阅静态初始化顺序惨败。

这是一个C++lambda,一种内联函数(参考: https://en.cppreference.com/w/cpp/language/lambda(

它没有捕获 [] 和输入参数 (( 并返回字符 (-> 个字符(。

定义 lambda 后,代码将调用 lambda 函数。这是最后一个((;.part。否则,它只是定义 lambda,但不使用它。