Когда использовать разработанный спецификатор типа
==================================================

Есть ли особенно веская причина, чтобы выбрать использование разработанного спецификатора типа? Например, при определенных обстоятельствах необходимо использовать`template` или же`typename` ключевые слова для устранения неоднозначности зависимого`template` или введите.

Но я не могу думать ни о каких примерах, где это могло бы произойти для чего-то такого, как перечисление. Возьмите следующий пример кода:

Почему я могу использовать синтаксис`baz()` обеспечивает более`bar()` (или наоборот)? Есть ли двусмысленный случай?

Нет никаких причин использовать такие спецификаторы, если только вы не столкнулись с ситуацией, когда имя скрыто по имени другого типа. Например, вполне допустимо объявлять переменную с именем`Foo` после объявления enum, поскольку, говоря неформально, имена объектов и имена типов живут в независимых "пространствах имен" (см. 3.3 / 4 для более формальной спецификации)

После`int Foo` декларация, ваш`bar` декларация станет недействительной, а более сложная`baz` декларация останется в силе.



Одной из веских причин выбрать использование разработанного спецификатора типа является переадресация объявленных структур или классов в заголовках. Учитывая заголовок, который определяет тип

Вы можете включить этот заголовок в прототип вашей функции

или используйте разработанный тип:

или, прямо вперед, объявляя, используя разработанный тип:

Любой из двух последних способов может помочь избежать постепенного вырождения ваших заголовков в полностью подключенную сеть, где включение любого отдельного заголовка притягивает все остальное (я работаю над программным продуктом, где это, к сожалению, верно, заставляя вас восстанавливать мир после многих Виды изменений, которые вы можете себе представить, были бы логически изолированными).

Я понимаю, что C ++ 11 также разрешит такого рода прямые ссылки для enum, что в настоящее время не разрешено в компиляторах C ++ 01.



Пример, который может подойти, - это когда у вас есть тип, а также нетипичный элемент с тем же именем. Используя разработанный спецификатор типа, вы можете явно запросить тип:

Без разработанного спецификатора типа,`foo` в`main` относится к`void foo(struct foo)`не к типу`struct foo`, Я бы не хотел, чтобы это было в рабочем коде, но вы попросили только пример, где это имеет значение. То же самое может произойти, если тип и функция (или переменная) определены в разных пространствах имен, где не тип был найден ранее при поиске. Вы можете заменить`struct` с`enum` выше.



Разработанные спецификаторы типов необходимы для объявления пользовательских типов. Одним из вариантов использования является предварительное объявление ваших типов. В маловероятном случае, если у вас есть функция с тем же именем, что и`enum` вы видите в области видимости, вам может понадобиться использовать разработанный спецификатор типа в объявлении функции: