【问题标题】:Scope resolution operator on enums a compiler-specific extension?枚举上的范围解析运算符特定于编译器的扩展?
【发布时间】:2010-10-01 06:58:43
【问题描述】:

this question 上,an answer 表示:

您可以使用 typedef 使 Color 枚举类型可访问,而无需指定它的“全名”。

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

这听起来对我来说是正确的,但有人否决了它并留下了这条评论:

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

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

【问题讨论】:

    标签: c++ standards


    【解决方案1】:

    我尝试了以下代码:

    enum test
    {
        t1, t2, t3
    };
    
    void main() 
    {
        test t = test::t1;
    }
    

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

    警告 C4482:非标准扩展 used: enum 'test' 用于合格 名字

    看起来不像是标准的。

    【讨论】:

    • 嗯,你是对的。现在想起来,我使用的是Sample::BLUE,而不是Colour::BLUE。谢谢。
    • 注意:它不是 C++98 的标准。它是 C++11 的标准。
    • @NicolBolas 是的,因为现在他们在C26812 中推荐enum class,这要求您使用范围解析来使用enum class
    【解决方案2】:

    这不标准。

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

    对于 C++11 之前的编译器,要确定枚举的范围,您需要在结构或命名空间内定义枚举。

    【讨论】:

    • 注意:在 C++11 中,您也可以对非classenums 使用范围。您只是没有必须像使用enum class 那样来确定它们的范围。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

        您可以做的就是创建一个与枚举同名的命名空间。这将有效地将枚举值添加到它们自己的范围中,您可以使用枚举/命名空间的名称来引用它们。当然,它只适用于否则将存在于全局(或另一个命名空间)范围内的枚举。

        还有一篇关于这个问题的文章。

        【讨论】:

          猜你喜欢
          • 2018-04-24
          • 2017-02-22
          • 2012-04-20
          • 2010-09-09
          • 2015-12-18
          • 1970-01-01
          • 1970-01-01
          • 2014-01-24
          • 2011-11-06
          相关资源
          最近更新 更多