7

成员函数有一个隐式this指针参数。那么,为什么要std::function接受这个签名,其中 S 是一个简单的类呢?(完整样本

std::function<void(S &)> func = &S::foo;

调用它也有效,并且可以区分对象:

S s1 = {5};
S s2 = {6};

func(s1); //prints 5
func(s2); //prints 6

我通常期望的是它需要一个指针,它也可以工作:(完整示例

std::function<void(S * const)> func = &S::foo;

S s1 = {5};
S s2 = {6};

func(&s1); //prints 5
func(&s2); //prints 6

this当隐式参数是指针时,当我将引用传递给成员函数时,为什么第一个工作?

4

2 回答 2

5

因为std::function设计正确。事实上,它this是一个指针是历史的偶然,也是成员函数内部的一个细节。该事实不应影响功能用户的设计决策。

当签名中的第一个参数类型是引用时,设计者std::function正确地决定接受成员函数。

于 2012-09-21T04:06:53.877 回答
3

std::function<SIG>可以由许多行为类似函数的事物构造而成,并将它们转换为适当的std::function对象。

在这种情况下void S::foo(),它的行为很像一个函数void foo_x(S&)(因为它们都需要S调用,并且可能修改S,什么都不返回)。因此std::function<void(S&)>提供了一个构造函数,用于将成员函数转换为函数对象。IE

std::function<void(S &)> func = &S::foo;

使用构造函数,例如std::function<void(S&)>( void(S::)() ),来创建等效于:

void foo_x(S & s ) { return s.foo(); }
std::function<void(S&)> func = foo_x;

相似地,

std::function<void(S * const)> func = &S::foo;

相当于

void foo_x(S * const s ) { return s->foo(); }
std::function<void(S* const )> func = foo_x;

通过像std::function<void(S* const )>( void(S::)() ).

于 2012-09-21T04:07:04.533 回答