c++ - 通过重复对象名称来调用静态方法?

标签 c++ c++11

我有一个单例:

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::AB的构造函数中是可用的,没有限定。它还隐藏 M::A,它仍然在B 的范围之外。如果你想使用 M::A,那么你必须编写 M::A(或者更好的 ::M::A )。

关于c++ - 通过重复对象名称来调用静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27152477/

相关文章:

c++ - Sublime Text 2 运行 C++11 代码

c++ - 初学者 C++、指针和继承错误

c++ - 访问和修改另一个线程堆栈上的自动变量

c++ - 具有 move 操作和右值转发的对象生命周期

c++ - 某些情况下 "disappears"的调试功能

c++ - 如何检查类型是否提供具有算术类型的函数

C++11:防止将对象分配给引用

c++ - 如何将对 ole32.dll 的调用重定向到我自己的代理 DLL?

c++ - 大容量存储设备删除策略

c++ - 将带有引用时间的时间戳转换为格式化时间