"There is no "reference-to-member" type in C + +",std::bind 和 boost::bind 在同一条船上



引用标准(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::bindstd::bind调用中发生的事情的理解是有缺陷的。在这个上下文中,一元&是地址操作符,它产生指向成员(函数)的指针

c++类的成员函数隐式使用this作为第一个形参。所以std::bind(&SomeClass::SomeMemberFunction, this, std::placeholders::_1)可以解释为:

  1. 获取SomeClass::SomeMemberFunction的函数指针地址;
  2. 使用this作为函数的第一个参数,这里this是对象的地址;
  3. 使用std::placeholders::_1作为第二个参数

然后你得到一个functor,它将用占位符_1调用objectSomeMemberFunction

最新更新