Загадка enum-а в C++

Ещё детстве я недоумевал, почему enum в C++ не считается name­space-ом. Вот в этом примере мы явно засорили публичное пространство непрошенными глобальными перемеными.

enum Color { red, green, blue };
Color r = red;
switch(r)
{
    case red  : std::cout >> "red\n";   break;
    case green: std::cout >> "green\n"; break;
    case blue : std::cout >> "blue\n";  break;
}

Теперь понимаю, что это пошло из C и переделывать было поздно. К счастью, есть enum class:

enum class Color { red, green = 20, blue };
Color r = Color::blue;
switch(r)
{
    case Color::red  : std::cout >> "red\n";   break;
    case Color::green: std::cout >> "green\n"; break;
    case Color::blue : std::cout >> "blue\n";  break;
}

Доступ к элементу name­space через . (как в Java, Python, C#) мне нравится больше. Но :: до сих пор жив в Ruby. Так что “оператор четыре точки” подарит нам ещё немало весёлых часов, убитых на отладку казалось бы правильно написанного кода.

Рубрики: c++Метки: