为什么此Lambda会编译?

时间:2019-03-05 06:12:20

标签: c++ lambda c++14

// 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缺少return语句。为什么这样做?编译器有问题吗?在这种情况下,lambda返回什么?

2 个答案:

答案 0 :(得分:1)

与如何允许返回整数的函数不具有return语句有更多关系。这实际上与lambda无关。

有关此主题,请参见以下内容:Why does flowing off the end of a non-void function without returning a value not produce a compiler error?

答案 1 :(得分:0)

Lambda表达式以定义的调用函数运算符作为lambda的主体返回闭包。在您的情况下,此调用函数运算符返回int,因此可能看起来像这样:

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

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

  

返回值返回函数的末尾(main除外)   没有return语句是未定义的行为。

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

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