【发布时间】:2012-08-12 05:03:27
【问题描述】:
今天我发现我长久以来(我的意思是长久——比如,二十年),在 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++ 允许像调用单个对象的直接成员一样调用静态成员函数——也就是说,通过使用 .或 -> 附加到对象实例的语法?
【问题讨论】:
-
嗯,为什么不呢?不同之处在于实例作为隐式参数传递,与成员函数一样,甚至不传递。无论哪种方式,编译器都可以访问函数指针本身。
-
“在我的特殊情况下,这个表达式的合法性导致了运行时错误”你能详细说明一下吗?
-
我记得当函数在 .h 中声明并在 .cpp 中定义时,我执行此操作时遇到编译器错误
-
嗯,与这里的第一个答案相同的信息。但我不认为“因为圣经这么说”是一个充分的答案。
-
是的,我不认为圣经是一个很好的参考(它基于信仰)。但基于“标准”的答案是本站的最终目标。该网站并非旨在回答诸如“为什么”这样的问题(因为那将是纯粹的猜测,因此相信不是事实)。我们希望网站上的事实而不是信念。
标签: c++ static member-functions