我有一個關於C++ 11標準的措辭的問題,因爲我以前不必經常深入研究它,最近發現自己對(肯定不重要) )無標題枚舉的主題。C++ 11訪問具有合格名稱的無人值守的枚舉器
我最近碰到一個代碼審查一些代碼,使用無作用域的枚舉,但訪問使用完全限定名統計員,這樣就來了:
enum SomeEnum
{
EnumA,
...
};
void foo()
{
SomeEnum x = SomeEnum::EnumA;
}
我敢肯定,這並不工作,並且SomeEnum不得不成爲這種行爲的枚舉類,但是,確實,它編譯乾淨。
偷看入C++ 11標準,我起初以爲該標準同意我的看法:
§7.2枚舉聲明:每個枚舉名和每個未範圍 枚舉在聲明直接包含 枚舉說明符的作用域。每個範圍枚舉器在 枚舉範圍內聲明。
在我看來,這表明只有在enum本身的直接包含的範圍內才聲明無調整的枚舉數。它沒有提到它們也在枚舉範圍內被聲明。
但是,更進一步,該標準確實包含一個示例,該示例顯示使用完全限定的名稱訪問非範型枚舉器。
在搜索結果中搜索了一小段地方,這些地方聲稱標準現在允許使用完全限定名稱,但沒有多少討論。這個規範中的弱言辭是否被這個例子弄清楚了,還是還有其他東西我錯過了?
再次,這不是地球打擊,但我希望有人能夠直接閱讀我的標準,我可以學到一些可能在未來的情況下有用的東西。
或者,也許把它簡單一些,問題是完全正確的,哪些名稱是在哪個範圍內聲明的,只是有一個'::'的特殊例外,其中'A :: B'不搜索'B '在'A'的範圍內。 – hvd 2014-11-04 22:11:38
我記得在C++ 03中,完全合格的枚舉器導致了編譯器錯誤。 C++ 11是否進行了更改以允許完全限定的無格式枚舉器?或者這是總是允許的,但是編譯器(看着你的MSVC)是buggy/non-conformant? – 2017-01-19 16:42:38
@ 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