Возможный дубликат:
Вызов метода статического члена С++ в экземпляре класса
Сегодня я обнаружил, что что-то, что у меня было давно (и я имею в виду давно, например, двадцать лет), считалось незаконным в С++, действительно легально. А именно, вызов статической функции-члена, как если бы она принадлежала отдельному объекту. Например:
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();
В моем конкретном случае законность этого выражения привела к ошибке времени выполнения, которая убедила меня в том, что особенность этого синтаксиса имеет больший академический интерес - это имеет практические последствия.
Почему С++ разрешает статические функции-члены вызываться так, как если бы они были непосредственными членами отдельных объектов, то есть с помощью. или → , прикрепленный к экземпляру объекта?