【发布时间】:2017-01-09 13:56:10
【问题描述】:
#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& 返回类型的std::function 设置为具有int 返回类型的lambda?允许这种类型的演员在没有任何警告的情况下隐式发生是一个陷阱,恕我直言。
【问题讨论】:
-
因为一个 const 引用可以绑定到一个临时的。
std::function本身没有问题。您将获得与旧功能相同的净效果。 该语言的那部分不会很快消失。 -
但是返回的临时的析构函数被调用。在这里演示melpon.org/wandbox/permlink/nSzeMfQM0Jpz9xbW
-
然后呢? C++ 从来没有保护你免于击中自己的脚。编译器可能很好并发出警告,但从纯 C++ 的角度来看,这仍然是一个有效的程序。这会一直存在,因为在某些情况下将临时对象绑定到引用可以延长临时对象的生命周期。而且那个非常有用。
-
不过,这并不能真正回答问题。 const 引用可以绑定到临时对象的事实并不能直接得出具有 const 引用返回类型的 std::function 可以从具有值返回类型的 lambda 构造。
-
但确实如此。因为
std::function旨在允许发生任何有效的转换。对于程序员应该注意的极端情况,过度复杂化是毫无意义的 IMO。
标签: c++ lambda std-function