pointer to member operator

英語版WikipediaC++演算子の項目を見てたら見慣れないものが。

Operator Name Syntax Is overloadable? In C?
Dereferencing Member Operator a.*b No No
Dereferencing Array Operator a->*b Yes No

なにこれ、知らねー。常識?とりあえず、使い方を調べてみた。

#include <iostream>

struct Foo {
    int a;

    Foo(int n) : a(n) {}

    int func() { return a; }
};

int main()
{
    using namespace std;

    Foo foo(10);
    Foo* pFoo = new Foo(20);

    int (Foo::*f)(void) = &Foo::func;
    int Foo::*member = &Foo::a;

    cout << (foo.*f)() << endl
         << (pFoo->*f)() << endl
         << foo.*member << endl
         << pFoo->*member << endl;

    delete pFoo;

    return 0;
}

こんな感じか。要するに、member pointer の dereference だな。知らんかった。まぁ普段 C++ を使わないし、使ってもこんなのを直接使う必要ほとんどないもんなぁ。標準ヘッダ見ると std::mem_fun ぐらいにしか使ってないし。Boost は boost::mem_fn 以外にも boost::spirit なんかでも使っているけど。
ちなみに、Wikipedia には Dereferencing Member Operator(Array ってのは多分 Arrow のミスだろう)とあるが、検索しても Wikipedia のページしか出てこない。他のページを見る限り Pointer to Member Operator というのが普通っぽい。
しかし int (Foo::*f)(void) = &Foo::func;とか int Foo::*member = &Foo::a; なんて Syntax はもう意味分からんね。