为什么 std::function 可以用具有不同 return 类型的 lambda 构造?
Why can std::function be constructed with a lambda with a different return type?
#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::function
。 int
可隐式转换为 const int&
,因此满足规则。
编译器可以随时对此发出警告,但对于特别偏向的极端情况,似乎需要做很多工作。
#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::function
。 int
可隐式转换为 const int&
,因此满足规则。
编译器可以随时对此发出警告,但对于特别偏向的极端情况,似乎需要做很多工作。