为什么std :: function可以用一个具有不同返回类型的lambda构造?

Dan*_*nra 10 c++ lambda std-function

以下编译正常:

#include <functional>

int main()
{
    std::function<const int&()> f = []() -> int {return 1;};
    const int& r = f(); // r is a dangling reference
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么可以将返回类型设置为std::function具有const int&返回类型的lambda int?恕我直言,允许这种演员隐含地发生并且没有任何警告.

Tar*_*ama 4

您可以std::function使用任何可以使用相关参数调用的对象构造一个,并且其返回值可以隐式转换为返回值std::function.int可以隐式转换为const int&,因此符合规则.

编译器可以随意警告这一点,但对于一个特别偏角的情况来说似乎需要做很多工作.

  • 警告引用返回绑定到临时值似乎非常值得,实际上是在大多数主要编译器中实现的.这里的问题是,在系统标题中发生了损坏的返回,其中警告被抑制.此外,还有一个[LWG问题](https://timsong-cpp.github.io/lwg-issues/2813)要求调整`std :: function`以使OP的代码无法编译. (3认同)