10 Declarations [dcl.dcl]

10.1 Specifiers [dcl.spec]

10.1.7 Type specifiers [dcl.type]

10.1.7.3 Elaborated type specifiers [dcl.type.elab]

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-keyExample:

enum class E { a, b };
enum E x = E::a;                // OK

end example]