为什么这个lambda汇编

Why does this Lambda compiles?

本文关键字:汇编 lambda 为什么      更新时间:2023-10-16
// Example program
#include <iostream>
#include <string>
void Do()
{
    std::cout << "Hello";
}
int Call(int(*f)())
{
    return f();
}
int main()
{
    // WHY DOES THE FOLLOWING COMPILE???!!! 
    // NOTE THE MISSING RETURN STATEMENT
    Call([]()->int{ Do(); });
}

对于某些编译器来说,上面的代码似乎还可以,并且也有效。但是显然,Lambda缺少返回声明。为什么这起作用?编译器有问题吗?在这种情况下,lambda返回了什么?

它与返回整数的函数如何没有返回语句有关。这与lambda并没有太大关系。

请参阅以下主题:为什么在不返回值的情况下流出非流动功能的末尾,不产生编译器错误?

lambda表达式以定义的呼叫函数运算符为lambda主体。在您的情况下,此通话功能运算符返回int,因此看起来像:

class unnamedClass {
  int operator()() const
  {
    Do();
  } // return is missing here
};

,它是根据参考的未定义行为。

流出值回收函数的末端(Main除外) 没有返回语句是未定义的行为。

编译器对其进行了编译,但会导致UB。在G 上,我得到了警告warning: no return statement in function returning non-void [-Wreturn-type]

因此,如果您希望代码正常工作,则需要添加return