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
可以分配任何类似objectfun
的函数,这些函数可以像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);
}