3

標準(2003)バージョンを引用しています。"C + +での" reference-to-member "タイプはありません。std :: bindとboost :: bindは同じボートにあります。

メンバーへのポインタは、クラス(9.4)、参照型を持つメンバーの静的メンバを指していなければならない

、または 「CV:非常8.3.3終了)と思う同じ、太字の強調は私ですボイド "[注:5.3と5.5も参照してください。 "memberへのポインタ"型は "ポインタ"型とは異なります。つまり、メンバへのポインタはメンバ宣言子の構文へのポインタによってのみ宣言され、 ポインタ宣言子の構文では決して宣言されません。 C + +には「メンバへの参照」型はありません。 ]

しかし、私は、例えば

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

など

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

など&SomeClass::SomeMemberFunction「メンバ関数への参照であるように見えるのが関与する、魔法のように作業の多くを見ます。

は、標準では、単に例えば

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

がその言語で有効な表明ではありません、以上であることを言っていますか?

+7

'&'は演算子のアドレスです。 – krzaq

+0

だから、標準が言っていることは、単に 'int(SomeClass ::&RefOnSomeMemberFunction)(Int)= SomeClass :: SomeMemberFunction'は言語の有効なアサーションではないということです。 –

+0

私が知る限り、はい。 – krzaq

答えて

2

文言の理解は正しいです。以下は、悪い形成されて:あなたは文法規則を見れば

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

実際には、唯一の

ネストされた名指定子*属性指定子-seqのオプト CV-修飾子があります -seq起こる内容をご理解の


D1オプトあなたが言及した boost::bindstd::bindへの呼び出しには欠陥があります。この文脈において、 unary &はオペレータのアドレスであり、 ポインタをメンバ(関数)に与える。そのポインタは引用した段落で定義されています。

+0

もう一度明確化のためにThx! –

0

C++クラスのメンバ関数は、暗黙的にthisを最初のパラメータとして使用します。だから、std::bind(&SomeClass::SomeMemberFunction, this, std::placeholders::_1) のように説明することができます。

  1. SomeClass::SomeMemberFunctionの関数ポインタのアドレスを取得します。
  2. thisを関数の最初のパラメータとして使用します。ここではthisがオブジェクトのアドレスです。
  3. std::placeholders::_1を2番目のパラメータとして使用します。

その後は、プレースホルダ_1objectSomeMemberFunctionを呼び出すこと、functorを取得します。

+0

標準からメンバーへの参照が許可されているかどうかの答えはどうですか? – krzaq

+0

私は@ user10000100_uが 'std :: bind'の仕組みを理解していないと思っていました。 – Mine

関連する問題