为什么这个lambda汇编
Why does this Lambda compiles?
// 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
。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 可组合的lambda/std::函数与std::可选
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 如何将lambda作为模板类的成员函数参数
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 在 lambda 捕获中声明的变量的类型推导
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 模板函数指针和lambda
- 两组使用lambda函数的大括号
- 使lambda不可复制/不可移动
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 将带有unique_ptr的可变 lambda 传递给 const&std::function
- AWS Lambda C++运行时权限被拒绝
- 捕获lambda中的std::数组
- 这 4 个 lambda 表达式之间有什么区别?
- 为什么这个lambda汇编
- 使用模板和lambda的汇编误差与clang