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

Why can std::function be constructed with a lambda with a different return type?

以下compiles fine

#include <functional>

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

为什么可以将类型为 const int& return 的 std::function 设置为类型为 int return 的 lambda?恕我直言,允许这种类型的转换在没有警告的情况下隐式发生是一个陷阱。

您可以使用任何可通过相关参数调用且其 return 值可隐式转换为 std::function return 的对象构造 std::functionint 可隐式转换为 const int&,因此满足规则。

编译器可以随时对此发出警告,但对于特别偏向的极端情况,似乎需要做很多工作。