可能重复:
类实例上的 C++ 静态成员方法调用
今天我发现我长久以来(我的意思是长久以来——比如,二十年),在 C++ 中认为非法的东西实际上是合法的。即,调用静态成员函数,就好像它属于单个对象一样。例如:
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++ 允许调用静态成员函数,就好像它们是单个对象的直接成员一样——也就是说,通过使用 . 或 -> 附加到对象实例的语法?