// 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返回什么?
答案 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
。