范围解析运算符枚举编译器特定的扩展?

Hea*_*eek 7 c++ standards

这个问题上,有一个答案表明:

您可以使用typedef使Color枚举类型可访问,而不指定它的"全名".

typedef Sample::Colour Colour;
Colour c = Colour::BLUE;
Run Code Online (Sandbox Code Playgroud)

这听起来对我来说是正确的,但有人对它进行了投票并留下了这个评论:

在枚举上使用范围解析运算符::(在"Color :: BLUE"中)是特定于编译器的扩展,而不是标准C++

真的吗?我相信我已经在MSVC和GCC上都使用了它,尽管我不确定.

Fer*_*cio 8

我尝试了以下代码:

enum test
{
    t1, t2, t3
};

void main() 
{
    test t = test::t1;
}
Run Code Online (Sandbox Code Playgroud)

Visual C++ 9使用以下警告编译它:

警告C4482:使用非标准扩展名:枚举'test'用于限定名称

看起来不像是标准.

  • 注意:它不是C++ 98的标准.它是C++ 11的标准. (3认同)

Dre*_*ann 8

那不标准.

在C++ 11中,您将能够使用枚举类声明制作带范围的枚举.

使用预C++ 11编译器来定义枚举,您需要在结构或命名空间内定义枚举.

  • 注意:在C++ 11中,您也可以使用作用域的非`类``枚举.你只是不要像使用`enum class`一样来限制它们. (3认同)

AnT*_*AnT 5

这在 C++98 中是不允许的。但是,从 C++11 开始,您可以选择将范围解析运算符与“旧式”枚举一起使用

enum E { A };

int main()
{
  A;    // OK
  E::A; // Also OK
}
Run Code Online (Sandbox Code Playgroud)

这两种引用方式A在 C++11 及更高版本中都是正确的。