Ответ 1
Преобразование из одного типа перечисления в другой осуществляется через целочисленный тип (возможно, базовый тип источника, не уверен).
Неявное преобразование из enum в целочисленный тип допускается как на C, так и на С++. Неявное преобразование из целочисленного типа в перечисление разрешено в C, но не в С++.
В принципе, С++ более безопасен по типу. Он пытается остановить вас:
enum {zero, one, two} x;
x = 143; // assigns a value outside the range of the enum
Если вы хотите выполнить это преобразование enum-enum в С++, вы можете использовать typeof/declspec/boost typeof или эквивалент. В GCC:
int main() {
enum {zero, one, two} x;
enum {zero1, one1, two1} y = two1;
typedef typeof(x) xtype;
x = static_cast<typeof(x)>(y);
}
Как правило, нет смысла делать это. Для большинства целей перечисления (и особенно анонимные) являются "перечисляемыми типами". Они просто реализуются по стандартам C и С++ как целые числа в забавных шляпах, но это не означает, что red
"равно" hammer
только потому, что каждый из них появляется сначала в двух разных перечислениях ( цвета и инструменты соответственно). static_cast
предполагает, что существует взаимосвязь между этими двумя типами. Любые два типа перечисления "связаны" тем, что оба имеют базовый целочисленный тип, и они связаны между собой, поэтому "отношение" там действительно мало говорит. Если вы напишете этот код, вы получите довольно бедную версию безопасности типов.