2017-10-18 77 views
12

一位同事不小心寫了這樣的代碼:爲什麼代碼「foo :: foo :: foo :: foob」編譯?

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編譯此。

這個編譯的規則是什麼?

+14

你能成爲一個更具體一點關於哪一部分,你不要指望,以順利地編譯? – neuhaus

+1

它沒有:https://godbolt.org/g/j2AbVn – Timbo

+1

有一個缺少包含文件和for循環缺少一個語句,但除了它編譯 – Johan

回答

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; 
} 

的循環運行3次。輸出是:「x = 1 x = 2 x = 3」。


foo::foo::foo::foob是一樣的foo::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 }

相關問題