форвард / сильное перечисление в VS2010 - PullRequest
27 голосов
/ 09 апреля 2010

В 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. Я не могу понять их и не могу найти документацию по этим двум функциям. Даже самые простые попытки скомпилировать.

<code>
enum class E { test };
int main() {}
</code>
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 ==========

<code>

int main()
{
  enum E : short;
}
</code>

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 / documents / 2007 / n2347.pdf

Предварительная декларация перечислений: http://www.open -std.org / jtc1 / sc22 / wg21 / docs / documents / 2008 / n2764.pdf

Ответы [ 2 ]

29 голосов
/ 09 апреля 2010

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

6 голосов
/ 09 апреля 2010

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

VC10 (и старше) принимает код, подобный следующему:

enum E : short { test };

E val = E::test;

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

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

enum E;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...