6 Basic concepts [basic]

6.4 Name lookup [basic.lookup]

6.4.4 Elaborated type specifiers [basic.lookup.elab]

elaborated-type-specifierМожет быть использовано для обозначения предварительно объявленных class-nameили enum-nameхотя имя было hidden в заявлении не-типа.

Если elaborated-type-specifierнет nested-name-specifier, и если он не elaborated-type-specifierуказан в декларации следующей формы:

class-key attribute-specifier-seqopt identifier ;

identifierищется в соответствии [basic.lookup.unqual] но игнорируя любые имена не типа , которые были объявлены. Если elaborated-type-specifierвводится enum ключевым словом, и этот поиск не находит ранее объявленного type-name, то elaborated-type-specifier это неправильно сформировано. Если elaborated-type-specifierвводится с помощью, class-keyи этот поиск не находит ранее объявленного type-name, или если elaborated-type-specifierпоявляется в объявлении с формой:

class-key attribute-specifier-seqopt identifier ;

elaborated-type-specifierявляется свидетельством того, что вводит , class-nameкак описано в [basic.scope.pdecl].

Если elaborated-type-specifierесть nested-name-specifier, выполняется поиск квалифицированного имени, как описано в разделе [basic.lookup.qual], но игнорируя любые объявленные не-типовые имена. Если поиск по имени не находит ранее объявленного type-name, elaborated-type-specifier значит, неправильно сформирован. [Example:

struct Node {
  struct Node* Next;            // OK: Refers to Node at global scope
  struct Data* Data;            // OK: Declares type Data
                                // at global scope and member Data
};

struct Data {
  struct Node* Node;            // OK: Refers to Node at global scope
  friend struct ::Glob;         // error: Glob is not declared, cannot introduce a qualified type ([dcl.type.elab])
  friend struct Glob;           // OK: Refers to (as yet) undeclared Glob at global scope.
  /* ... */
};

struct Base {
  struct Data;                  // OK: Declares nested Data
  struct ::Data*     thatData;  // OK: Refers to ​::​Data
  struct Base::Data* thisData;  // OK: Refers to nested Data
  friend class ::Data;          // OK: global Data is a friend
  friend class Data;            // OK: nested Data is a friend
  struct Data { /* ... */ };    // Defines nested Data
};

struct Data;                    // OK: Redeclares Data at global scope
struct ::Data;                  // error: cannot introduce a qualified type ([dcl.type.elab])
struct Base::Data;              // error: cannot introduce a qualified type ([dcl.type.elab])
struct Base::Datum;             // error: Datum undefined
struct Base::Data* pBase;       // OK: refers to nested Data

end example]