在VS2010中,forward/strong枚举是什么?

27

http://blogs.msdn.com/vcblog/archive/2010/04/06/c-0x-core-language-features-in-vc10-the-table.aspx上有一张表格,列出了在2010 RC中实现的C++0x特性。其中包括转发枚举和强类型枚举,但它们被列为“部分”。文章的主要内容说这意味着它们可能不完整或以某种非标准的方式实现。

所以我有VS2010RC,并正在尝试使用C++0x特性。我无法理解这两个特性,并且找不到任何关于它们的文档。甚至最简单的尝试都无法编译通过。


enum class E { test };
int main() {}

失败并显示以下错误信息:
1>e:\dev_workspace\experimental\2010_feature_assessment\2010_feature_assessment\main.cpp(518): error C2332: 'enum' : 缺少标记名称 1>e:\dev_workspace\experimental\2010_feature_assessment\2010_feature_assessment\main.cpp(518): error C2236: 意外的 'class' 'E'。是否忘记了 ';'? 1>e:\dev_workspace\experimental\2010_feature_assessment\2010_feature_assessment\main.cpp(518): error C3381: 'E':程序集访问说明符仅在使用 /clr 选项编译的代码中可用 1>e:\dev_workspace\experimental\2010_feature_assessment\2010_feature_assessment\main.cpp(518): error C2143: 语法错误 : 缺少 ';'(在“}”之前) 1>e:\dev_workspace\experimental\2010_feature_assessment\2010_feature_assessment\main.cpp(518): error C4430: 缺少类型说明符 - 假定为 int。注意:C++ 不支持默认 int ========== Build: 0 成功,1 失败,0 最新,0 跳过 ==========


int main()
{
  enum E : short;
}


失败并显示以下错误信息:看起来这个实现肯定是非常不标准的,他们似乎认为这个功能只是“部分完成”。我该如何重写这段代码以访问转发和强类型特性呢?
一些关于我正在尝试使用的新功能的进一步信息:
强类型枚举: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf 枚举的前向声明: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2764.pdf

请注意,这些是单独的测试程序。第二个程序中的E并不是试图前向声明与第一个程序中相同的E。 - Edward Strange
2个回答

28

我认为我找到了答案。在关键字文档中,我在VS 2010文档中找到了“enum class”。它只能在托管代码中使用,在实际的C++编译中不受支持。因此,看起来他们指的是这个C++0x特性被“部分完成”,因为它根本没有完成。


即使这不是一个错误,也可以尝试在http://connect.microsoft.com/上提出请求。 - Alessandro Jacopson

6

我也对此感到困惑,但我猜他们只是在编译器中利用现有的非标准扩展。

VC10(以及早期版本)接受这样的代码:

enum E : short { test };

E val = E::test;

也就是说,你可以使用枚举名称作为命名空间限定符,并且可以指定类型。

至于前向声明的枚举,以下代码对我来说编译正常:

enum E;

没有类型说明符

嗯...是的,我能够在没有类型说明符的情况下前向声明枚举。但是不能稍后应用类型说明符,如果尝试这样做,前向声明将拒绝该说明符。 - Edward Strange
显然,在MSVC 8中引入了指定底层类型的功能。 - Georg Fritzsche

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接