为什么' std::function '可以接受指向成员函数的指针,而' Args::function '的第一个参数…



假设我们有一个类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是不可复制的,那么它将无法工作。

相关内容

  • 没有找到相关文章