注:我觉得我以前的答案是错误的它不是Koenig Lookup即参数相关的名称查找(ADL),所以我删除了(前面)的答案,因为我发现,从标准的相关部分,回答你的。问题。
Your c ode直接来自C++ 03标准的§9.4/ 2节。
静态成员可直接在其类或 的范围从一等级类派生 (第10节)的范围被称为 ;在此 情况下,静态成员被称为 仿佛使用的合格-ID表达 ,与嵌套名称说明符合格-ID命名类 范围从该静态成员是 引用的 。
然后,它给出了这样的例子(你问的问题)
[Example:
int g();
struct X {
static int g();
};
struct Y : X {
static int i;
};
int Y::i = g(); // equivalent to Y::g();
—end example]
然后,它说,在§9。4/3
如果不合格-ID(5.1)在 使用静态构件 以下成员的声明符-ID的定义, 和名称查找(3.4.1)认定的 不合格-id表示静态 构件,枚举,或嵌套类型的 成员的类(或基类成员的类的 的),则 不合格-ID被变换成 合格-ID表达,其中 嵌套名称说明符命名分类s 范围成员 参考。
因为,在静态成员的定义发生只,这意味着Y::g()
被称为只在初始化,而不是在分配:
//definition-cum-initialization
int Y::i = g(); // equivalent to Y::g();
int main()
{
//assignment
Y::i = g(); // does not equivalent to Y::g(); it calls global g()
}
看到输出这里:http://www.ideone.com/6KDMI
让我们考虑另一个例子:
struct B{};
B f();
namespace NS
{
struct A { static B b;};
B f();
}
//Definition cum Initialization
B NS::A::b = f(); //calls NS::f()
B b = f(); //calls global f()
int main()
{
//Assignment
NS::A::b = f(); //calls global f()
b = f(); //calls global f()
}
在这里看到完整的演示:http://www.ideone.com/53hoW
如果你想全局函数使用'::克()' – 2011-04-29 09:13:22