假设我们有一个类Foo
,如下所示:
struct Foo
{
int x = 100;
void print()
{
std::cout << x << std::endl;
}
};
显然,我们可以使用std::function
包裹Foo::print
如下:
std::function<void(Foo*)> f(&Foo::print);
Foo bar;
f(&bar); // Output 100
// or
std::function<void(Foo&)> f(&Foo::print);
Foo bar;
f(bar); // Output 100
但是一旦我发现使用std::function<void(Foo)>
而不是std::function<void(Foo*)>
或std::function<void(Foo&)>
仍然有效:
// Neither Foo& nor Foo*
std::function<void(Foo)> f(&Foo::print);
Foo bar;
f(bar); // Still output 100
为什么最后一个有效?
成员函数需要调用一个特定的类对象,而void(Foo)
只是一个接受Foo
类副本的函数类型。
f(bar)
将复制bar
并调用其副本的print()
成员函数。如果Foo
是不可复制的,那么它将无法工作。