Forward/strong enum в VS2010
В http://blogs.msdn.com/vcblog/archive/2010/04/06/c-0x-core-language-features-in-vc10-the-table.aspx есть таблица с функциями С++ 0x, которые реализованы в RC 2010 года. Среди них перечислены пересылочные пересылки и строго типизированные перечисления, но они перечислены как "частичные". В главном тексте статьи говорится, что это означает, что они либо неполны, либо реализованы каким-то нестандартным способом.
Итак, у меня есть VS2010RC и я играю с функциями С++ 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
Ответы
Ответ 1
Я думаю, что нашел ответ. Я нашел "enum class" в документации VS 2010 по документации по ключевым словам. Он управлялся только - не поддерживается в реальных сборках на С++. Таким образом, кажется, что они означают, что эта функция С++ 0x "частично выполнена", поскольку она вообще не выполняется.
Ответ 2
Я тоже задавался вопросом об этом, но я предполагаю, что они просто используют существующее нестандартное расширение в своем компиляторе.
VC10 (и старше) принимает такой код:
enum E : short { test };
E val = E::test;
То есть, вам разрешено использовать имя перечисления в качестве определителя пространства имен, и вам разрешено указывать тип.
Что касается перепрограммированных переходов, для меня компилируются следующие компиляции:
enum E;
без спецификатора типа