lambda返回' 1'整天

时间:2015-02-02 08:48:01

标签: c++ gcc lambda g++ return

有这样的代码

#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”?

3 个答案:

答案 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),添加()