【问题标题】:"There is no “reference-to-member” type in C + +", std::bind and boost::bind are in the same boat“C++ 中没有‘reference-to-member’类型”,std::bind 和 boost::bind 在同一条船上
【发布时间】:2016-10-20 06:52:32
【问题描述】:

引用 8.3.3 的标准 (2003) 版本(我认为最近的其他人也这么说),粗体强调是我的:

指向成员的指针不应指向类 (9.4) 的静态成员、具有引用类型的成员或 “简历无效。” [注:另见 5.3 和 5.5。 “指向成员的指针”类型不同于“指针”类型, 也就是说,指向成员的指针仅由指向成员声明符语法的指针声明,而不是由 指针声明符语法。 C++ 中没有“引用成员”类型。 ]

但我看到很多

boost::bind(&SomeClass::SomeMemberFunction, this, _1)

还有

std::bind(&SomeClass::SomeMemberFunction, this, std::placeholders::_1)

etc 像一个魅力,涉及 &SomeClass::SomeMemberFunction's 这似乎是对成员函数的引用。

标准是否只是简单地说例如

int (SomeClass::&RefOnSomeMemberFunction) (int) = SomeClass::SomeMemberFunction

在该语言中不是有效的断言,还是还有更多?

【问题讨论】:

  • & 是运算符的地址。
  • 那么标准所说的只是,例如,int (SomeClass::&RefOnSomeMemberFunction) (int) = SomeClass::SomeMemberFunction 不是语言中的有效断言?
  • 据我所知,是的。
  • 好的,感谢您的澄清

标签: c++ reference standards member-function-pointers member-functions


【解决方案1】:

您对措辞的理解是正确的。以下是不正确的:

int (SomeClass::&RefOnSomeMemberFunction) (int) = SomeClass::SomeMemberFunction;

其实看语法规则就只有

nested-name-specifier * attribute-specifier-seqopt cv-qualifier-seqoptD1


您对您提到的boost::bindstd::bind 调用中发生的情况的理解存在缺陷。在这种情况下,unary & 是地址运算符,它产生指向成员(函数)的 指针。该指针在您引用的段落中定义。

【讨论】:

  • 再次感谢您的澄清!
【解决方案2】:

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

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

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

【讨论】:

  • 如何回答标准是否允许引用成员?
  • 我以为@user10000100_u 不明白std::bind 是如何工作的,我试着解释一下它是如何工作的。
猜你喜欢
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-19
相关资源
最近更新 更多