2014-11-04 53 views
9

我有一個關於C++ 11標準的措辭的問題,因爲我以前不必經常深入研究它,最近發現自己對(肯定不重要) )無標題枚舉的主題。C++ 11訪問具有合格名稱的無人值守的枚舉器

我最近碰到一個代碼審查一些代碼,使用無作用域的枚舉,但訪問使用完全限定名統計員,這樣就來了:

enum SomeEnum 
{ 
    EnumA, 
    ... 
}; 

void foo() 
{ 
    SomeEnum x = SomeEnum::EnumA; 
} 

我敢肯定,這並不工作,並且SomeEnum不得不成爲這種行爲的枚舉類,但是,確實,它編譯乾淨。

偷看入C++ 11標準,我起初以爲該標準同意我的看法:

§7.2枚舉聲明:每個枚舉名和每個未範圍 枚舉在聲明直接包含 枚舉說明符的作用域。每個範圍枚舉器在 枚舉範圍內聲明。

在我看來,這表明只有在enum本身的直接包含的範圍內才聲明無調整的枚舉數。它沒有提到它們也在枚舉範圍內被聲明。

但是,更進一步,該標準確實包含一個示例,該示例顯示使用完全限定的名稱訪問非範型枚舉器。

在搜索結果中搜索了一小段地方,這些地方聲稱標準現在允許使用完全限定名稱,但沒有多少討論。這個規範中的弱言辭是否被這個例子弄清楚了,還是還有其他東西我錯過了?

再次,這不是地球打擊,但我希望有人能夠直接閱讀我的標準,我可以學到一些可能在未來的情況下有用的東西。

回答

7

要從draft C++11 standard尋找的報價是從節5.1基本表達式其中在段說:

嵌套名說明符,它表示一個枚舉(7.2)中,隨後通過 該枚舉的枚舉器的名稱是 引用枚舉器的限定標識。結果是枚舉器。 的結果類型是枚舉類型。結果是一個價值。

它並不限制使用於作用域枚舉並且因此例如在部分7.2枚舉聲明

enum direction { left='l', right='r' }; 

void g() { 
    direction d; // OK 
    d = left; // OK 
    d = direction::right; // OK 
} 

是完全一致的。這也與部分3.4.3合格名字查找它說是一致的:

類或空間成員或枚舉的名稱可以在::範圍解析運算符(5.1)之後被稱爲 於施加到一個 表示它的類,名稱空間或枚舉的嵌套名稱說明符。 [...]

和:

由嵌套名稱說明符提名的 枚舉類型應代表這個枚舉的枚舉前綴的名稱。

再一次,沒有限制這種行爲範圍枚舉。

Examples are non normative但只要它們與規範文本不衝突,那麼它們應該被認爲是一個很好的指導方針。

+0

或者,也許把它簡單一些,問題是完全正確的,哪些名稱是在哪個範圍內聲明的,只是有一個'::'的特殊例外,其中'A :: B'不搜索'B '在'A'的範圍內。 – hvd 2014-11-04 22:11:38

+1

我記得在C++ 03中,完全合格的枚舉器導致了編譯器錯誤。 C++ 11是否進行了更改以允許完全限定的無格式枚舉器?或者這是總是允許的,但是編譯器(看着你的MSVC)是buggy/non-conformant? – 2017-01-19 16:42:38

+0

@ void.pointer我只想使用Wandbox或Coliru並使用'-pedantic'標誌w/gcc或clang,我們可以看到[在這個例子中](http://melpon.org/wandbox/permlink/WbjqktMcxle9UXk0)鏗鏘聲稱它是C++ 03中的C++ 11擴展。看起來像[N2347](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf)添加了措辭。 – 2017-01-19 17:06:05