引用标准(2003)版本(我认为最近其他人也在说同样的话)8.3.3的末尾,粗体强调是我的:
指向成员的指针不能指向类(9.4)的静态成员、引用类型的成员或"简历空白。[注:又见5.3和5.5。类型"指向成员的指针"不同于类型"指针",也就是说,指向成员的指针只能由指向成员的指针声明器语法声明,而不能由指针声明器语法。在c++ 中没有"对成员的引用"类型。)
但是我看到很多
boost::bind(&SomeClass::SomeMemberFunction, this, _1)
和
std::bind(&SomeClass::SomeMemberFunction, this, std::placeholders::_1)
等像一个魅力一样工作,包括&SomeClass::SomeMemberFunction
,似乎是对成员函数的引用。
标准是否只是说,例如
int (SomeClass::&RefOnSomeMemberFunction) (int) = SomeClass::SomeMemberFunction
在该语言中不是一个有效的断言,或者有更多的断言
你对措辞的理解是正确的。
int (SomeClass::&RefOnSomeMemberFunction) (int) = SomeClass::SomeMemberFunction;
事实上,如果你看一下语法规则,只有
nested-name-specifier * attribute-specifier-seqopt cv-qualifier-seqopt
D1
你对你提到的boost::bind
和std::bind
调用中发生的事情的理解是有缺陷的。在这个上下文中,一元&
是地址操作符,它产生指向成员(函数)的指针。
c++类的成员函数隐式使用this
作为第一个形参。所以std::bind(&SomeClass::SomeMemberFunction, this, std::placeholders::_1)
可以解释为:
- 获取
SomeClass::SomeMemberFunction
的函数指针地址; - 使用
this
作为函数的第一个参数,这里this
是对象的地址; - 使用
std::placeholders::_1
作为第二个参数
然后你得到一个functor
,它将用占位符_1
调用object
的SomeMemberFunction
。