3

C ++ 11std::bind標準から遊んでいたとき、コンパイラによって次のことが許可されることを認識しました。

class Foo
{
public:
  void F();
  int G(int, int);
};

void Foo::F()
{
  auto f = bind(&Foo::G, this, _1, _2);
  cout << f(1,2) << endl;
}

int Foo::G(int a, int b)
{
  cout << a << ',' << b << endl;
  return 666;
}

Foo::Gただし、 -行の前の「&」を削除すると、bindコンパイラエラーが発生します(MinGW 4.7を使用)。

どちらも「通常の」関数でFoo::G機能するのに、なぜメンバー関数へのポインターとして有効ではないのですHか?&H

LG ntor

4

2 に答える 2

4

&はメンバー関数のアドレスを取る必要があります。一部のコンパイラでは同じものを省略できますが、これは非標準であり、混乱を招く場合があります。

メンバー関数ポインターについては、http: //www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possibleで読むことができます 。

于 2012-11-06T22:28:13.497 に答える
2

その理由の1つは、一貫性であった可能性があると思います。クラス内で言うことができることを思い出してください

MyClassOrOneOfItsBases::memberFunction();

修飾された名前は、メンバーへのポインターを形成する代わりに、メンバー関数を指定するため、正常にコンパイルされます。

于 2012-11-07T10:01:14.623 に答える