为什么std :: function在签名中接受这个引用?

时间:2012-09-21 03:46:10

标签: c++ function this

成员函数具有隐式this指针参数。为什么std::function接受此签名,那么,S是一个简单的类? (complete sample

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

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

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

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

我通常期望它需要一个指针,它也可以起作用:(complete sample

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

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

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

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

2 个答案:

答案 0 :(得分:5)

因为std::function设计正确。 this是指针的事实是历史事故和成员函数内部细节​​。事实应该对功能用户的设计决策没有影响。

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

答案 1 :(得分:3)

std::function<SIG>可以从许多行为类似于函数的东西构建,将它们转换为适当的std::function对象。

在这种情况下,void S::foo()的行为与函数void foo_x(S&)非常相似(因为它们都需要S来调用,并可能修改S,不返回任何内容。因此std::function<void(S&)>提供了一个构造函数,用于将成员函数转换为函数对象。即。

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::)() )这样的构造函数。