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.