lambda 始终返回'1'

lambda returns '1' all time

本文关键字:返回 lambda      更新时间:2023-10-16

有这样的代码

#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),请添加()