конструкция компилятора — перечисления C ++: назначить переменную или использовать разрешение области видимости?

Я компилирую этот код 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» в списке параметров. Это зависит от компилятора?

1

Решение

Это потому что перечислитель с незаданной областью и поэтому каждый перечислитель доступен в той же области, что и перечисление Назови себя. Перечислитель с определенной областью потребует использования ::, Это покрыто в Проект стандарта 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
}
2

Другие решения

Перечислители C ++ всегда объявляются в области, содержащей перечисление.
В C ++ 11 добавлены «перечислители с областью видимости», определенные с помощью enum class вместо перечисление ключевое слово.

0

Нету. enumс просто ints. По умолчанию значения нумеруются с нуля вперед, поэтому ваше перечисление неявно объявляется как:

enum SortMethod
{
BY_NAME = 0,
BY_WEIGHT = 1
}

Таким образом, значения могут использоваться везде, где может использоваться целое число.

Ситуация усложняется, если вы используете перечислители с ограниченным диапазоном.

0
По вопросам рекламы [email protected]