今日、C++ では違法と考えられていた長い間 (つまり、20 年間) 持っていたものが、実際には合法であることを発見しました。つまり、静的メンバー関数を、個々のオブジェクトに属しているかのように呼び出します。例えば:
struct Foo
{
static void bar() { cout << "Whatever."; }
};
void caller()
{
Foo foo;
foo.bar(); // Legal -- what?
}
私は通常、静的メンバー関数が「スコープ解決構文」で厳密に呼び出されるのを目にします。したがって、次のようになります。
Foo::bar();
静的メンバー関数はクラスの特定のインスタンスに関連付けられていないため、これは理にかなっています。したがって、特定のインスタンスが関数呼び出しに構文的に「関連付けられている」とは思われません。
しかし、今日、GCC 4.2、GCC 4.7.1、および Clang 3.1 (コンパイラのランダム サンプリングとして) が前者の構文と次の構文を受け入れることを発見しました。
Foo* foo = new Foo;
foo->bar();
私の特定のケースでは、この表現の合法性が実行時エラーを引き起こし、この構文の特殊性は学術的な関心以上のものであると確信しました。それは実際的な結果をもたらします。
C++ では、静的メンバー関数を個々のオブジェクトの直接のメンバーであるかのように呼び出すことができるのはなぜですか。つまり、. または -> オブジェクトインスタンスにアタッチされた構文?