Начиная с C ++ 11, вы можете использовать enum class
(или enum struct
- то же самое, объявленное по-разному), где значения перечисления ограничиваются именем перечисления. Например, вот правильное объявление C ++ 11.
enum class token_type {
open_paren,
close_paren,
identifier
};
Однако, чтобы получить доступ к значениям перечисления, вы должны правильно охватить его, используя оператор ::
. Следовательно, это допустимое назначение в C ++ 11:
token_type type = token_type::close_paren;
Но это не так:
token_type type = close_paren;
Это решает конфликт имен и означает, что вам не нужно использовать пространство имен контейнера или структуру только для того, чтобы остановить область значений, утечку которых они не должны делать. Это означает, что следующее перечисление может существовать в той же области видимости, что и token_type
:
enum class other_enum {
block,
thingy,
identifier
};
Теперь два значения, называемые identifier
в двух разных структурах, не будут мешать.