【问题标题】:Why does this Lambda compiles? [duplicate]为什么这个 Lambda 会编译? [复制]
【发布时间】:2019-03-05 06:12:20
【问题描述】:
// Example program
#include <iostream>
#include <string>

void Do()
{
    std::cout << "Hello";
}

int Call(int(*f)())
{
    return f();
}

int main()
{
    // WHY DOES THE FOLLOWING COMPILE???!!! 
    // NOTE THE MISSING RETURN STATEMENT
    Call([]()->int{ Do(); });
}

似乎对于某些编译器,上面的代码编译得很好,而且它也可以工作。但显然,lambda 缺少 return 语句。为什么这行得通?是编译器的问题吗?在这种情况下 lambda 会返回什么?

【问题讨论】:

    标签: c++ lambda c++14


    【解决方案1】:

    这与如何允许返回整数的函数没有返回语句有关。这与 lambda 并没有太大关系。

    请参阅有关此主题的以下内容:Why does flowing off the end of a non-void function without returning a value not produce a compiler error?

    【讨论】:

      【解决方案2】:

      Lambda 表达式以定义的调用函数运算符作为 lambda 的主体返回闭包。在您的情况下,此调用函数运算符返回 int,因此它可能看起来像:

      class unnamedClass {
        int operator()() const
        {
          Do();
        } // return is missing here
      };
      

      根据reference,这是未定义的行为。

      从返回值函数的末尾流出(main 除外) 没有返回语句是未定义的行为。

      Compiler 编译它,但它导致 UB。在 g++ 上,我收到警告 warning: no return statement in function returning non-void [-Wreturn-type]

      所以如果你想让你的代码正常工作,你需要添加return

      【讨论】:

      • 感谢您对此进行调查。我想知道为什么它是警告而不是编译错误。在什么情况下,警告会优先于编译错误?你知道为什么这样做吗?我遇到了这种情况作为一个错误,所以我想看看将来是否有什么可以防止这种情况发生。
      • 它导致 UB if Do(); 正常返回(而不是例如抛出)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      相关资源
      最近更新 更多