将 std::function<int(int)> 分配给 std::function<const int&(const int& x)>

Assigning std::function<int(int)> to std::function<const int&(const int& x)>

本文关键字:int gt const function lt std 分配      更新时间:2023-10-16

以下代码进行了编译,但在VC++2015(发行版)中产生了未定义的输出,其他编译器也出现了运行时错误。

#include <functional>
#include <iostream>
int main()
{
    std::function<int(int)> f = [](int x) { return x; };
    std::function<const int&(const int& x)> g = f;
    std::cout << g( 42 ) << std::endl;
}

为什么允许分配g = f;

考虑重写等效代码以避免lambdas或std::function:

int f(int x) { return x; } 
int const& g(int const& x) { return f(x); } 

这是一个格式非常好的代码,但它会返回一个对临时的悬挂引用,从而最终导致未定义的行为。原始代码之所以有效,也是因为同样的原因:您可以隐式地将对象转换为相同类型的引用。不幸的是,在这种情况下。

右值可以绑定到const&const&可以转换为右值。

检查:

int f(int x){return x;}
int const& g(int const& x){ return f(x); }

类似地,对g的调用是合法的,没有错误,但是读取g(42)的结果是UB——引用挂起。

一个好的编译器会看到绑定到临时的引用被返回并发出警告。

CCD_ 7简单地检查类型是否可以在两者之间转换;它不进行寿命分析。可能应该这样,因为我们可以静态地检测到这个错误。