C++ 为什么返回和不返回的std::函数是可转换的?

C++ 为什么返回和不返回的std::函数是可转换的?,c++,C++,为什么这样做有效 std::function<int(int)> ret_func = [](int x) { return x; }; std::function<std::string(int)> ret_func1 = [](int x) { return std::to_string(x); }; std::function<void(int)> func = ret_func; std::function<void(int)> func1

为什么这样做有效

std::function<int(int)> ret_func = [](int x) { return x; };
std::function<std::string(int)> ret_func1 = [](int x) { return std::to_string(x); };
std::function<void(int)> func = ret_func;
std::function<void(int)> func1 = ret_func1;
std::function ret_func=[](int x){return x;};
std::function ret_func1=[](int x){return std::to_string(x);};
std::function func=ret_func;
std::function func1=ret_func1;
因为
std::function
中的functor被类型擦除?此强制转换在任何类型的函数之间都不起作用;例如,如果您更改参数并尝试分配给另一个
std::function
,为什么这不起作用?因为返回值不会更改函子的类型,但参数会更改


不要将其视为铸造,而应将其视为
std::function
作为值分配给
std::function

  • std::function
    可以分配任何类似object
    fun
    的函数,这些函数可以像
    static\u cast(fun(v))
    v
    是一个
    int

  • std::function
    很容易满足该标准,因为您可以:

  • void foo(std::function fun){
    乐趣(12);
    }
    
    因此,
    std::function
    必须可分配给
    std::function
    。就这些

    库如何实现这一点并不重要。它只是为了履行API合同

    免责声明:这有点过于简单。该标准实际上对
    std::function
    ->
    std::function
    赋值有一些规定,比如移动构造和处理未赋值的
    std::functions
    s。然而,这个答案中概述的语义原则仍然可以作为一种解释

    根据要求,本标准的相关部分包括:

    [func.wrap]

    模板函数(F); 约束:对于参数类型ArgTypes,F是可调用的左值([func.wrap.func])。。。和返回类型R

    如果被视为未赋值操作数的表达式调用(declval(),declval()…)格式良好([func.require]),则可调用类型F对于参数类型ArgTypes和返回类型R是左值可调用的

    [功能要求]

    定义调用(f,t 1. T 2. ,…,t N )作为静态广播(调用(f,t 1. T 2. ,…,t N ))如果R是cv void,则调用(f,t 1. T 2. ,…,t N )隐式转换为R


    因此,由于
    std::function
    对于
    void(int)
    是可调用的左值,因此它是一个有效值。现在,在实践中,由于其他构造函数/赋值运算符将截取它,这实际上并没有起作用,但语义仍然存在。

    std::function
    不需要精确的签名,但“兼容”,
    int
    /
    std::string
    可以更准确地转换为
    void
    std:function
    可以调用任何接受
    params
    并返回任何内容的函数,
    std:function
    将简单地忽略函数返回的内容,并将自身返回
    void
    (无)你有没有可能拥有标准的
    std::function
    assignment部分?@kreuzerkrieg用我认为相关的部分来回答这个问题。
    void foo(std::function<int(int)> fun) {
      fun(12);
    }