передайте/сильны перечисление в VS2010

По http://blogs.msdn.com/vcblog/archive/2010/04/06/c-0x-core-language-features-in-vc10-the-table.aspx существует таблица, показывающая C++ 0x опции, которые реализованы в 2010 RC. Среди них перечислены, передав перечисления и перечисления со строгим контролем типов, но они перечислены как "неравнодушные". В основном тексте статьи говорится, что это означает, что они являются или неполными или реализованы некоторым нестандартным способом.

Таким образом, у меня есть VS2010RC, и играю вокруг с C++ 0x функции. Я не могу понять эти и не могу найти документацию относительно этих двух функций. Даже самая простая компиляция попыток.


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

fails with:

1>e:\dev_workspace\experimental\2010_feature_assessment\2010_feature_assessment\main.cpp(518): error C2332: 'enum' : missing tag name
1>e:\dev_workspace\experimental\2010_feature_assessment\2010_feature_assessment\main.cpp(518): error C2236: unexpected 'class' 'E'. Did you forget a ';'?
1>e:\dev_workspace\experimental\2010_feature_assessment\2010_feature_assessment\main.cpp(518): error C3381: 'E' : assembly access specifiers are only available in code compiled with a /clr option
1>e:\dev_workspace\experimental\2010_feature_assessment\2010_feature_assessment\main.cpp(518): error C2143: syntax error : missing ';' before '}'
1>e:\dev_workspace\experimental\2010_feature_assessment\2010_feature_assessment\main.cpp(518): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========



int main()
{
  enum E : short;
}


Fails with:
1>e:\dev_workspace\experimental\2010_feature_assessment\2010_feature_assessment\main.cpp(513): warning C4480: nonstandard extension used: specifying underlying type for enum 'main::E'
1>e:\dev_workspace\experimental\2010_feature_assessment\2010_feature_assessment\main.cpp(513): error C2059: syntax error : ';'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Таким образом, кажется, что это должна быть некоторая полностью нестандартная реализация, которая позволила им выравнивать по ширине вызов этой функции, "частично" сделанной. Как я переписал бы тот код для получения доступ к передаче и сильной функции типа?

Немного дополнительной информации о новых возможностях я пытаюсь использовать:

Перечисления со строгим контролем типов: 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

27
задан Edward Strange 8 April 2010 в 22:28
поделиться

2 ответа

Думаю, я нашел ответ. Я нашел "enum class" в документации VS 2010 в документации по ключевым словам. Это только управляемое - не поддерживается в реальных сборках C ++. Похоже, они имеют в виду, что эта функция C ++ 0x «частично реализована» в том смысле, что она вообще не реализована.

28
ответ дан 28 November 2019 в 05:36
поделиться

Я тоже задавался вопросом об этом, но я предполагаю, что они просто используют существующее нестандартное расширение в своем компиляторе.

VC10 (и старше) принимает такой код:

enum E : short { test };

E val = E::test;

То есть вам разрешено использовать имя перечисления в качестве квалификатора пространства имен, и вы можете указать тип.

Что касается перечислений с прямым объявлением, для меня подходят следующие компиляции:

enum E;

без спецификатора типа

6
ответ дан 28 November 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: