【发布时间】:2021-03-30 12:30:06
【问题描述】:
在下面的代码中,为什么允许std::function<void (X)> 绑定到函数void f(X&&)?
#include <functional>
struct X {};
void f1(X x) {}
void f2(X& x) {}
void f3(const X&) {}
void f4(X&& x) {}
int main()
{
X x;
f1(x); // ok
f2(x); // ok
f3(x); // ok
// f4(x); // doesn't compile
std::function<void (X)> ff1(f1); // ok
//std::function<void (X)> ff2(f2); // doesn't compile
std::function<void (X)> ff3(f3); // ok
std::function<void (X)> ff4(f4); // ok... why?
return 0;
}
为什么允许这样做的直觉是什么,std::function 将如何实现它,以及当您将左值参数传递给std::function 时它实际上意味着什么,然后它会调用接受右值引用的函数?
【问题讨论】:
-
等一下,定义
ff1...ff4的 4 行中都是f1吗? -
@Enlico 似乎问题在修复后仍然有效,因为只有
ff2(f2)无法编译:godbolt.org/z/a3TcEhGvT -
ff2(f2)失败是我问的原因。一个错字是可以的,但 OP 也写了// ok,所以他/她应该澄清一下。 -
一个
std::function包装了一个可调用对象。函数指针是一种可调用对象;还有其他种类。可调用对象通常没有任何签名。它可以使用给定的一组参数调用,也可以不调用。 -
@Enlico:修复了 OP 的错字,我希望我不会因为修复而使问题变质(标题仍然有效)。
标签: c++ std-function