“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”的含义 [重复]的主要内容,如果未能解决你的问题,请参考以下文章