lambda 始终返回'1'
lambda returns '1' all time
有这样的代码
#include <iostream>
using namespace std;
int main()
{
cout<<[](){ return 0;};
cout<<[](){ return 3.2;};
cout<<[](){ return true;};
cout<<[](){ return false;};
cout<<[](){ return "Hello world!";};
cout<<[]()->int{ return 0;};
cout<<[]()->double{ return 3.2;};
cout<<[]()->bool{ return true;};
cout<<[]()->bool{ return false;};
cout<<[]()->const char*{ return "Hello world!";};
return 0;
}
用gcc version 4.8.2
编译它,我的输出只有1111111111
.为什么只有"1"?
当 lambda 表达式没有捕获时,它可以隐式转换为函数指针。
反过来,函数指针可以隐式转换为bool
,如果指针不为空,则产生true
,这会被打印出来。
如果您在输出之前cout << std::boolalpha
,则会看到truetruetrue....
打印
如果您在 lambda 中捕获某些内容,则它不再可转换为函数指针,并且会收到编译器错误。
如果要打印通过调用 lambda 返回的结果,则需要 ()
,正如其他人指出的那样。
你说什么:
cout<<[](){ return 0;};
你想说什么:
cout<<[](){ return 0;}();
看到支架了吗?
如果你这样做会怎样:
#include <iostream>
using namespace std;
void foo()
{
}
int main()
{
cout<<foo;
return 0;
}
您不是在调用该方法,而是在尝试打印其地址。选择cout
的重载operator <<(bool)
,因此对于您尝试打印的任何有效函数,您都会得到一个1
。
实际上,调用函数(或lambadas),请添加()
。
相关文章:
- 如何建立使用模板函数的lambda函数的尾部返回类型
- c++ lambda:柯里和函数:使用按值捕获与按引用捕获返回不同的结果
- 从 lambda 返回的对象将丢失属性值
- C++ lambda 返回自己
- 如何在没有返回值的情况下使用(特征)unaryExpr 和 lambda 函数?
- 不返回的 lambda 奇怪行为
- 有没有办法根据 lambda 参数返回类型部分专用化我的模板化函数?
- std::function<std::optional<T>()> 如何与返回 T 的 lambda 兼容?
- 从两个 lambda 的函数返回 lambda 时的链接器错误
- C++:从捕获函数参数的函数返回 lambda 表达式
- 如何捕获返回 lambda 的函数的返回值类型
- 为什么在三元运算符的分支之间返回 lambda 对某些 lambda 有效?
- C++ 为什么编译器无法生成返回 Lambda 中捕获变量的常量引用的代码
- 从函数返回 lambda 并传入引用捕获
- 如何在模板中返回 lambda 指针
- 通过右值引用返回 lambda
- 为什么对于具有多个返回路径的lambda返回lambda,我会得到一个类型推导错误
- Lambda返回Lambda错误地推断返回类型
- 如何返回 lambda 对象
- 为什么我的 constexpr 函数不能返回 lambda?