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

C++ 为什么std::function可以用具有不同返回类型的lambda构造?,c++,lambda,std-function,C++,Lambda,Std Function,以下是: #包括 int main() { 函数f=[]()->int{return 1;}; const int&r=f();//r是一个悬空引用 返回0; } 为什么可以将带有const int的std::function返回类型设置为带有int返回类型的lambda?允许这种类型的强制转换隐式发生并且没有任何警告是一个错误。您可以使用任何对象构造一个std::function,该对象可以使用相关参数调用,并且其返回值隐式转换为std::function返回值int隐式转换为const i

以下是:

#包括
int main()
{
函数f=[]()->int{return 1;};
const int&r=f();//r是一个悬空引用
返回0;
}

为什么可以将带有
const int的
std::function
返回类型设置为带有
int
返回类型的lambda?允许这种类型的强制转换隐式发生并且没有任何警告是一个错误。

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


编译器可以随时对此发出警告,但对于一个特殊的corner-y corner情况,似乎需要做大量的工作。

因为const引用可以绑定到临时。这不是std::function本身的问题。使用好的旧函数也会得到相同的净效果。语言的这一部分在短期内不会有任何进展,但返回的临时文件的析构函数会被调用。在这里演示,然后呢?C++从来不会保护你不让自己在脚上射击。编译器可能是不错的,并发出警告,但这仍然是一个有效的程序从纯C++的角度。这是因为在某些情况下,将临时对象绑定到引用可以延长临时对象的生命周期。这是非常有用的,但这并不能真正回答问题。const引用可以绑定到临时引用这一事实并不能直接派生具有const引用返回类型的std::函数可以从具有值返回类型的lambda构造,但它确实可以。因为
std::function
设计为允许进行任何有效转换。对于程序员应该注意的一些极端情况,过于复杂化是毫无意义的。谢谢。事实上并不是这样,因为很容易(至少对我来说)错误地假设返回常量引用的lambda的推导返回类型也是常量引用,这是错误的;它只是一种价值。这是我实际遇到的一个bug,因为我对lambdas的返回类型推断理解不够好(如果您好奇,请参阅),警告引用返回绑定到临时值似乎很有价值,事实上大多数主要编译器都实现了这一点。这里的问题是,中断返回发生在系统标头中,警告被抑制。此外,还有一个请求对
std::function
进行调整,以使OP的代码不可编译。
#include <functional>

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