elaborated-type-specifier: class-key attribute-specifier-seqopt nested-name-specifieropt identifier class-key simple-template-id class-key nested-name-specifier templateopt simple-template-id enum nested-name-specifieropt identifier
attribute-specifier-seqНе должно появляться в elaborated-type-specifier тех пор , пока последний не является единственным компонентом декларации. Если an elaborated-type-specifierявляется единственной составляющей декларации, декларация неправильно сформирована, если только она не является explicit specialization, an explicit instantiation или имеет одну из следующих форм:
class-key attribute-specifier-seqopt identifier ; friend class-key ::opt identifier ; friend class-key ::opt simple-template-id ; friend class-key nested-name-specifier identifier ; friend class-key nested-name-specifier templateopt simple-template-id ;
В первом случае, attribute-specifier-seqесли есть, принадлежит объявленному классу; атрибуты в attribute-specifier-seqвпоследствии считаются атрибутами класса, когда бы он ни был назван.
[basic.lookup.elab] описывает, как выполняется поиск имени identifierв файле elaborated-type-specifier. Если identifierразрешается в class-nameили enum-name, elaborated-type-specifier вводит его в объявление так же, как simple-type-specifierвводит свой type-name. Если identifierразрешается в typedef-nameили simple-template-idрешает шаблон псевдонима специализации, то elaborated-type-specifierплохо сформирован. [ Note: Это означает, что в шаблоне класса с шаблоном type-parameter Tобъявление
friend class T;
плохо сформирован. Однако подобное объявление friend T; разрешено ([class.friend]). ] — end note
class-keyИли enum ключевое слово присутствует в elaborated-type-specifierсогласовывают в натуральной форме с декларацией , в которой имя в elaborated-type-specifierссылается. Это правило также применяется к форме elaborated-type-specifierобъявления класса class-nameили, friend поскольку оно может быть истолковано как относящееся к определению класса. Таким образом, в любом elaborated-type-specifier, то enum ключевое слово должно использоваться для обозначения enumeration, то должны быть использованы для обозначения , и либо или должны быть использованы для обозначения объявляются с помощью или . [ union class-key union class struct class-key class class struct class-key Example:
enum class E { a, b };
enum E x = E::a; // OK
— end example ]