为什么代码 "foo::foo::foo::foob" 能够编译通过?

14

一位同事意外地编写了以下代码:

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 } );
    // ...
}

GCC 5.1.0可以编译此内容。

是什么规则使得这个内容能够被编译?


15
你能否更具体地说明哪一部分你不希望编译成功? - neuhaus
1
它不会:https://godbolt.org/g/j2AbVn - Timbo
1
除了缺少一个包含文件和for循环缺少一个语句之外,它可以编译。 - Johan
1
这可以简化为 struct foo { static const int v{42}; }; auto x{foo::foo::foo::foo::foo::v}; - user7860670
2
@sbi 你哪部分不太明白?是注入的类名还是基于范围的for循环? - songyuanyao
显示剩余2条评论
2个回答

31

4

我将代码更改为:

#include <initializer_list>
#include <iostream>
struct foo {
  foo() : baz(foobar) {}
  enum bar {foobar, fbar, foob};
  bar baz;
};

int main() {
  for( auto x : { foo::foobar,
                  foo::fbar,
                  foo::
                  foo::
                  foo::foob } )
                  {
                      std::cout << "x=" << x << std::endl;
                  }
  return 0;
}

for循环运行3次。输出结果为:"x=1 x=2 x=3"。


foo::foo::foo::foobfoo::foob 是相同的。 因此。

for( auto x : { foo::foobar,
                  foo::fbar,
                  foo::
                  foo::
                  foo::foob } )

相同

for( auto x : { foo::foobar, foo::fbar, foo::foob } )
{
}

这意味着x在范围{ foo::foobar, foo::fbar, foo::foob }内。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接