C++ 为什么std::函数在签名中接受此引用?

C++ 为什么std::函数在签名中接受此引用?,c++,function,this,C++,Function,This,成员函数有一个隐式此指针参数。那么,为什么std::function接受这个签名,其中S是一个简单的类?() 我通常期望的是它需要一个指针,它也可以工作:() std::function func=&S::foo; s1={5}; s2={6}; func(&s1)//印刷品5 func&s2//印刷品6 当隐式此参数是指针时,当我将引用传递到成员函数时,为什么第一个参数起作用?因为std::function设计正确。this是指针这一事实是历史的偶然,也是成员函数内部的一个细节。这一事实不应

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

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

std::function func=&S::foo;
s1={5};
s2={6};
func(&s1)//印刷品5
func&s2//印刷品6

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

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

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

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

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

std::function<void(S &)> func = &S::foo;
std::function func=&S::foo;
使用构造函数(类似于
std::function(void(S:)())
)来创建与以下内容等效的内容:

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

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

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

通过像
std::function(void(S:)())

这样的构造函数,这是一个非常有用的阅读,谢谢。当你认为<代码> STD::函数与原始函数指针无关,并且有能力做它喜欢增加它包裹的东西的能力时,它就更有意义了。
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;