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;