[basic.scope.pdecl] / 7
Точка объявления класса first , объявленная в
уточненный спецификатор типа выглядит следующим образом:
(7.1) для декларации вида
ключ класса атрибут-спецификатор-секв опт идентификатор ;
идентификатор объявляется как имя класса в области действия, содержащей объявление, в противном случае
(7.2) для уточненного спецификатора типа вида
ключ класса идентификатор
, если подробный спецификатор типа используется в decl-specier-seq
или
параметр-объявление-предложение функции, определенной в пространстве имен
область действия, идентификатор
объявлен как имя класса в пространстве имен
который содержит декларацию; иначе,
кроме как друг
При объявлении идентификатор объявляется в наименьшем пространстве имен или
блок
область действия, содержащая объявление. [Примечание: эти правила также
применять в шаблонах. - конец
примечание] [Примечание: другие формы
подробный спецификатор типа не объявляет новое имя, и
поэтому должен ссылаться на существующее имя типа . Смотрите [basic.lookup.elab] и
[Dcl.type.elab].
- конец примечания]
Рассмотрим приведенный выше случай (7.2), в котором подробный спецификатор типа используется в decl-specier-seq параметра-объявления-предложения функции, определенной в области имен. Как это согласуется с тем фактом, что этот уточненный спецификатор типа должен быть first объявлением класса в его пространстве имен?
Рассмотрим пример ( demo ) ниже:
Файл prog.cc
:
struct S;
extern S s;
int S;
void f(struct S&); // The elaborated-type-specififer `struct S` is not
// the first declaration in the global namespace and
// if we eliminate the first declaration `struct S;`
// on the top, the code doesn't compile !!
int main(){
f(s);
}
Файл other.cc
:
#include<iostream>
struct S{
int i = 1;
};
void f(struct S& s) { std::cout << s.i << '\n'; }
S s;
Обратите внимание, что приведенный выше код компилируется и выполняется правильно, но подробный спецификатор типа в объявлении параметра функции f
не первый в глобальное пространство имен.
Предполагая, что моя интерпретация относительно [basic.scope.pdecl] / 7 верна, я хотел бы увидеть пример, демонстрирующий применение пункта (7.2) выше, где указанная декларация будет first в своем пространстве имен.