我有一个单例:
struct foo {
static foo& instance() {
static foo f;
return f;
}
};
当我重新安排一些代码时,我“错误地”得到了这个语句:
foo::foo::instance()
但是我的编译器(gcc 4.7)认为这是正确的。事实上,即使是 foo::foo::foo::instance()
也可以编译。为什么?
最佳答案
这是由于“injected-name”——这意味着如果 foo
是一个类名,并且同名“foo”也被注入(inject)到类范围中,这就是你的代码的原因作品。它 100% 符合标准。
这是一个有趣的例子,展示了这个功能的好处:
namespace N
{
//define a class here
struct A
{
void f() { std::cout << "N::A" << std::endl; }
};
}
namespace M
{
//define another class with same name!
struct A
{
void f() { std::cout << "M::A" << std::endl; }
};
struct B : N::A //NOTE : deriving from N::A
{
B()
{
A a;
a.f(); //what should it print?
}
};
}
a.f()
应该调用什么? a
的类型是什么?是 M::A
还是 N::A
?答案是 N::A
,而不是 M::A
。
由于名称注入(inject),N::A
在B
的构造函数中是可用的,没有限定。它还隐藏 M::A
,它仍然在B
的范围之外。如果你想使用 M::A
,那么你必须编写 M::A
(或者更好的 ::M::A
)。
关于c++ - 通过重复对象名称来调用静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27152477/