【问题标题】:The meaning of "static char __ = []() -> char" [duplicate]“static char __ = []() -> char”的含义 [重复]
【发布时间】: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++ 的地方。或者任何东西,真的。那里的代码不一定好。

标签: c++ lambda


【解决方案1】:

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

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

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

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

this answerIs 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,但不使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 2016-09-29
      • 2012-10-27
      • 2012-01-08
      • 2014-10-28
      • 2013-01-25
      相关资源
      最近更新 更多