Добро пожаловать в C ++!
для чего-то еще более забавного попробуйте это:
#include <string>
int main(int argc, const char *argv[])
{
std::string s;
s = 3.141592654;
return 0;
}
почему он компилируется?Причина в том, что языковые правила так говорят.
В этом странном случае «официальное» объяснение того, почему этот пример компилируется, состоит в том, что казалось правильным разрешить std::string::operator+=(char)
(IMO нормально и логично с прагматической точки зренияview) и "следовательно" также присваивание от char (IMO нелогично не sequitur).Но символы - это целые числа (нелогично, но наследие Си), а двойники могут быть неявно преобразованы в целые числа (нелогично, но наследие Си).Поэтому в C ++ нелогично (но законно) присваивать строковое значение double.
Не расстраивайтесь, если вы не знали, что большинство программистов на C ++, которые я показывал, были озадачены тем, почему такая ерунда компилируется иМысль о других семантических или компиляторских ошибках.
В случае вашего вопроса причина в том, что перечисления похожи на целые числа в некотором контексте (вероятно, из-за наследования в случаях использования), но не похожи на целые числа в каком-то другом контексте.Это абсурдно, но это то, что предписывает стандарт.
Если вы чувствуете себя некомфортно из-за очевидного отсутствия логики, пожалуйста, помните, что C ++ в основном является результатом долгой истории и даже комитета (!), Поэтому логика недействительно много общего с этим.Это также подразумевает, что нельзя использовать логику, чтобы избежать изучения C ++: независимо от того, насколько вы умны, вы не сможете угадать исторические происшествия и политические решения комитета.
Высокая сложность C ++, это отсутствие логики во многихместа и наличие undefined behavior daemons
вместо runtime error angels
- это также то, что IMO в основном исключает изучение C ++ экспериментальным путем.
Выберите хорошую книгу (или несколько) и прочитайте ее (их) от корки до корки... к сожалению, нет другого пути.Мои предложения: «Язык программирования C ++» (Stroustrup), «Эффективный C ++» и «Более эффективный C ++» (Meyers), «Часто задаваемые вопросы по C ++» (Cline / Lomow / Girou).
C ++ довольно симпатичныймощное и приятное оружие для владения, но подходите к нему не с той стороны, и это может стать худшим из ваших кошмаров.Предполагать, что вы можете понять это, просто используя логику, является неправильным подходом (и не потому, что ваша логика слаба, а потому, что C ++ - это не просто логика).