为什么代码"foo :: foo :: foo :: foob"编译?

sbi*_*sbi 12 c++ gcc names language-lawyer c++11

一位同事不小心写了这样的代码:

struct foo {
  foo() : baz(foobar) {}
  enum bar {foobar, fbar, foob};
  bar baz;
};

void f() {
  for( auto x : { foo::foobar,
                  foo::fbar,
                  foo::
                  foo::
                  foo::foob } );
    // ...
}
Run Code Online (Sandbox Code Playgroud)

GCC 5.1.0编译了这个.

这个编译的规则是什么?

son*_*yao 30

这里使用了注入类名,

为了查找的目的,它自己定义中的类的名称充当其自身的公共成员类型别名(除非用于命名构造函数):这称为inject-class-name

然后

foo::
foo::
foo::foob
Run Code Online (Sandbox Code Playgroud)

foo::foo::foo::foob与...相同foo::foob.

然后for (auto x : {foo::foobar, foo::fbar, foo::foob })是一个基于范围的for循环(自C++ 11开始),它迭代3个枚举器形成的braced-init-list.