【问题标题】:Why this C++ lambda funtion returns 1?为什么这个 C++ lambda 函数返回 1?
【发布时间】:2021-04-11 01:09:24
【问题描述】:

我有一个如下的 lambda 函数,它明确声明 int 作为它的返回类型,但在它的实现中,它什么也不做。此外,它打印出它的返回值。令我惊讶的是,它编译没有错误并返回1。谁知道原因?

auto lambda = [](int a) -> int{};
cout << lambda << endl;

【问题讨论】:

  • 尝试将 return 语句添加到您的 lambda 函数中,例如 return a;,然后打印 std::cout &lt;&lt; lambda(123) 以观察不同的结果。

标签: c++ c++11 lambda


【解决方案1】:

我打印出它的返回值

没有。您正在打印出 lambda 本身。对于这种情况,它转换为函数指针,然后隐式转换为bool。对于非空指针,转换后的结果为true(在这种情况下为1。您可以使用std::boolalpha 来获取打印结果为truefalse,如cout &lt;&lt; boolalpha&lt;&lt; lambda &lt;&lt; endl;)。

如果要打印出lambda的返回值,应该是

cout << lambda(42) << endl;

但请注意,在没有 return statement 的情况下从值返回函数的末尾流出(main 除外)是未定义的行为,这对于 lambdas 也是如此。


顺便说一句:只有没有捕获的 lambda 可以隐式转换为函数指针,而有捕获的 lambda 不能。

【讨论】:

  • 不是UB那个lambda没有returnstatement吗?
  • @francesco 是的。添加到答案中。
  • 我虽然它应该是格式错误的,但它被允许编译有点奇怪。
  • @Swift-FridayPie 你的意思是没有返回语句还是直接打印出lambda
  • @Swift-FridayPie 嗯,是的。我认为分析一个函数中的所有分支并不容易。直接打印有效;即使它大部分都没有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 2018-01-28
  • 1970-01-01
相关资源
最近更新 更多