C++ &引用;没有“;参考成员”;输入C++&引用;,std::bind和boost::bind在同一条船上

C++ &引用;没有“;参考成员”;输入C++&引用;,std::bind和boost::bind在同一条船上,c++,reference,standards,member-function-pointers,member-functions,C++,Reference,Standards,Member Function Pointers,Member Functions,引用8.3.3的标准(2003)版本(我认为最近的其他版本也这么说),粗体强调是我的: 指向构件的指针不得指向类别(9.4)的静态构件、具有引用类型的构件或 “cv void。”[注:另见5.3和5.5.“指向成员的指针”类型与“指针”类型不同, 也就是说,指向成员的指针仅由指向成员的指针声明器语法声明,而从不由 指针声明符语法。在C++中没有“引用成员”类型。] 但我看到的例子很多 boost::bind(&SomeClass::SomeMemberFunction, this, _1

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

指向构件的指针不得指向类别(9.4)的静态构件、具有引用类型的构件或 “cv void。”[注:另见5.3和5.5.“指向成员的指针”类型与“指针”类型不同, 也就是说,指向成员的指针仅由指向成员的指针声明器语法声明,而从不由 指针声明符语法。在C++中没有“引用成员”类型。]

但我看到的例子很多

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

std::bind(&SomeClass::SomeMemberFunction, this, std::placeholders::_1)
etc工作起来很有魅力,包括
&SomeClass::SomeMemberFunction
,它们似乎是对成员函数的引用

例如,标准是否简单地说

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

不是该语言中的有效断言,或者还有其他断言吗?

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

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

  • 然后你会得到一个
    functor
    ,它将调用带有占位符
    \u 1
    对象的
    SomeMemberFunction
    ,你对这个词的理解是正确的。以下内容格式不正确:

    int (SomeClass::&RefOnSomeMemberFunction) (int) = SomeClass::SomeMemberFunction;
    
    事实上,如果你看看语法规则,只有

    嵌套名称说明符*属性说明符seqopt cv限定符seqopt
    D1



    您对所提到的调用
    boost::bind
    std::bind
    中发生的事情的理解是有缺陷的。在此上下文中,是addressof运算符,它生成指向成员(函数)的指针。这个指针是在你引用的段落中定义的。

    &
    是addressof操作符。所以标准简单地说,例如,
    int(SomeClass::&RefOnSomeMemberFunction)(int)=SomeClass::SomeMemberFunction
    在语言中不是有效的断言?据我所知,是的。好的,感谢您的澄清这是如何回答标准是否允许引用成员的问题的?我想@user10000100\u您不明白
    std::bind
    是如何工作的,我试图解释它是如何工作的。再次感谢您的澄清!