有这样的代码
#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”?
答案 0 :(得分:7)
当lambda表达式没有捕获时,它可以隐式转换为函数指针。
反过来,函数指针可以隐式转换为bool
,如果指针不为空则会产生true
,这会被打印出来。
如果您在输出前cout << std::boolalpha
you'll see truetruetrue....
printed instead。
如果你在lambda中捕获了某些东西,那么它就不再可以转换为函数指针了,you'd get a compiler error。
如果你想打印通过调用lambda返回的结果,那么你需要()
,正如其他人所指出的那样。
答案 1 :(得分:5)
你说什么:
cout<<[](){ return 0;};
你想说什么:
cout<<[](){ return 0;}();
查看括号?
答案 2 :(得分:5)
如果你这样做会怎么样:
#include <iostream>
using namespace std;
void foo()
{
}
int main()
{
cout<<foo;
return 0;
}
您没有调用该方法,而是尝试打印其地址。选择了operator <<(bool)
的重载cout
,因此对于您尝试打印的任何有效函数,都会得到1
。
实际上,调用函数(或lambadas),添加()
。