“static char __ = []() -> char”的含义 [重复]

Posted

技术标签:

【中文标题】“static char __ = []() -> char”的含义 [重复]【英文标题】:The meaning of "static char __ = []() -> char" [duplicate] 【发布时间】:2020-09-29 07:07:27 【问题描述】:

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

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

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

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

但是我不知道

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

有人能解释一下代码的含义吗?

【问题讨论】:

这能回答你的问题吗? What is a lambda expression in C++11? 那里可能有更好或更深入的目标,这只是谷歌的第一个。 __ 标识符保留给语言实现。如果这个变量定义在标准库实现之外的某个地方,那么它将具有未定义的行为。 重新打开,我认为关于这段代码的解释不仅仅是“什么是 lambda” 顺便说一句,你不应该把 LeetCode 作为学习 C++ 的地方。或者任何东西,真的。那里的代码不一定好。 【参考方案1】:

[]() -> char ... 是 lambda,不接受任何输入并返回 char

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

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

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

见this answer 到Is there a better way in c++ for one time execution of a set of code instead of using a static variable check

【讨论】:

【参考方案2】:

此代码:[]() -> char return '\0'; ()

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

代码非常类似于:

char qux()  return '\0'; 
char __ = qux();

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

命名变量__ 会导致未定义的行为,因为包含双下划线的名称是为实现保留的,此代码最好使用一些有效的标识符,如果存在,则可能通过未命名的命名空间隐藏碰撞。


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

但是,这种方法并不能真正解决问题,就好像所说的其他语句在不同的翻译单元中一样,不能保证__的初始化发生在其他单元的静态初始化之前。见static initialization order fiasco。

【讨论】:

感谢您的回答!现在,我明白了代码的目的是在 main() 之前执行函数。【参考方案3】:

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

它没有捕获 [] 也没有输入参数 () 并返回 char (-> char)。

定义 lambda 后,代码调用 lambda 函数。也就是最后一个();部分。否则它只定义 lambda,但不使用它。

【讨论】:

以上是关于“static char __ = []() -> char”的含义 [重复]的主要内容,如果未能解决你的问题,请参考以下文章