English 中文(简体)
枚举类型中的作用域解析运算符是编译器特定的扩展吗?
原标题:
  • 时间:2009-01-14 01:16:58
  •  标签:

这个问题上,有一个回答指出:

你可以使用typedef将颜色枚举类型定义为可访问的,而无需指定它的“完整名称”。

typedef Sample::Colour Colour;
Colour c = Colour::BLUE;

在我看来,这听起来是正确的,但有人已向下投票并留下了此评论:

在枚举类型中使用范围解析运算符::(例如“Colour::BLUE”)是特定于编译器的扩展,而不是标准C ++。

那是真的吗?我相信我已经在MSVC和GCC上都使用过了,虽然我不确定。

最佳回答

我尝试了以下代码:

enum test
{
    t1, t2, t3
};

void main() 
{
    test t = test::t1;
}

Visual C++ 9编译时出现以下警告:

warning C4482: nonstandard extension used: enum test used in qualified name

看起来并不像是标准的。

问题回答

那不是标准的。

在C++11中,您将能够使用enum class声明创建具有作用域的枚举。

在C++11之前的编译器中,如果想要给枚举加作用域限定符,需要在结构体或命名空间中定义枚举。

C++98 中不允许这样做。但是,从 C++11 开始,您可以可选地在“旧风格”枚举中使用作用域解析运算符。

enum E { A };

int main()
{
  A;    // OK
  E::A; // Also OK
}

在C++11及其后版本中,对于A的两种引用方式都是正确的。

在标准C++中,"::" 左边的东西必须是类或命名空间,枚举不算。

你可以创建一个与枚举同名的命名空间,以避免这种情况。这将有效地将枚举值添加到它们自己的范围中,并且你可以使用枚举/命名空间的名称来引用它们。当然,这仅适用于本应存在于全局(或其他命名空间)范围内的枚举。

这个问题还有一篇文章在某处。





相关问题
热门标签