Я компилирую этот код C ++ с помощью Visual Studio 2012. Я заметил, что могу использовать значения перечисления без оператора разрешения области видимости (: :).
Вот важные части моего кода вне int main ():
enum SortMethod
{
BY_NAME,
BY_WEIGHT
};
Затем внутри int main () я использую следующее:
int main()
{
LinkedList* list = new LinkedList();
/*
Insert values into linked list, in sorted order.
*/
list->print( BY_NAME );
cout << endl << endl;
list->print( BY_WEIGHT );
return 0;
}
Почему эти вызовы функций работают? Функция print () принимает один аргумент SortMethod. Поэтому я решил, что мне нужно сделать следующее:
SortMethod sortByName = BY_NAME;
list->print( sortByName );
Но оказывается, что я могу просто использовать «BY_NAME» в списке параметров. Это зависит от компилятора?
Это потому что перечислитель с незаданной областью и поэтому каждый перечислитель доступен в той же области, что и перечисление Назови себя. Перечислитель с определенной областью потребует использования ::
, Это покрыто в Проект стандарта C ++ раздел 7.2
Перечень деклараций параграф 10 который говорит:
Каждое перечисляемое имя и каждый перечислитель с незаданной областью объявляются в области, которая сразу содержит спецификатор перечисления. Каждый перечислитель с областью действия объявляется в области перечисления. Эти имена подчиняются правилам области действия, определенным для всех имен в (3.3) и (3.4).
и предоставляет следующий пример, первый пример с direction
использует перечислитель с незаданной областью и не требует использования ::
но второй пример с altitude
является область видимости и, следовательно, требует использования ::
:
enum direction { left=’l’, right=’r’ };
void g() {
direction d; // OK
d = left; // OK
d = direction::right; // OK
}
enum class altitude { high=’h’, low=’l’ };
void h() {
altitude a; // OK
a = high; // error: high not in scope
a = altitude::low; // OK
}
Перечислители C ++ всегда объявляются в области, содержащей перечисление.
В C ++ 11 добавлены «перечислители с областью видимости», определенные с помощью enum class вместо перечисление ключевое слово.
Нету. enum
с просто int
s. По умолчанию значения нумеруются с нуля вперед, поэтому ваше перечисление неявно объявляется как:
enum SortMethod
{
BY_NAME = 0,
BY_WEIGHT = 1
}
Таким образом, значения могут использоваться везде, где может использоваться целое число.
Ситуация усложняется, если вы используете перечислители с ограниченным диапазоном.