::S
является квалифицированным идентификатором.
В квалифицированном идентификаторе ::S::f
, S::
является спецификатором вложенного имени.
В неформальных терминах вложенныйспецификатор-имени - это часть идентификатора, которую
- начинается либо в самом начале квалифицированного идентификатора, либо после оператора разрешения исходной области (: :), если он появляется в самом началеИдентификатор и
- заканчиваются последним оператором разрешения области в квалифицированном идентификаторе.
Очень неофициально, идентификатор является либо квалифицированным идентификатором, либо неквалифицированным идентификатором.Если идентификатор является квалифицированным идентификатором, он фактически состоит из двух частей: спецификатора вложенного имени, за которым следует неквалифицированный идентификатор.
Дано:
struct A {
struct B {
void F();
};
};
A
- это неквалифицированный идентификатор. ::A
- квалифицированный идентификатор, но не имеет спецификатора вложенного имени. A::B
- квалифицированный идентификатор, а A::
-спецификатор вложенного имени. ::A::B
является квалифицированным идентификатором, а A::
является спецификатором вложенного имени. A::B::F
является квалифицированным идентификатором, и оба B::
и A::B::
являются спецификаторами вложенных имен. ::A::B::F
является квалифицированными идентификаторами, а B::
и A::B::
являются спецификаторами вложенных имен.
Другой пример:
#include <iostream>
using namespace std;
int count(0); // Used for iteration
class outer {
public:
static int count; // counts the number of outer classes
class inner {
public:
static int count; // counts the number of inner classes
};
};
int outer::count(42); // assume there are 42 outer classes
int outer::inner::count(32768); // assume there are 2^15 inner classes
// getting the hang of it?
int main() {
// how do we access these numbers?
//
// using "count = ?" is quite ambiguous since we don't explicitly know which
// count we are referring to.
//
// Nested name specifiers help us out here
cout << ::count << endl; // The iterator value
cout << outer::count << endl; // the number of outer classes instantiated
cout << outer::inner::count << endl; // the number of inner classes instantiated
return 0;
}
РЕДАКТИРОВАТЬ:
В ответ на ваш комментарий, я считаю, что утверждение просто означает, что аргументы шаблона обрабатываются в контексте и строке, с помощью которых ониобъявлены.Например,
в f.~foo();
, foo ищется в пределах f.
, а в пределах foo<int>
допустимо ссылаться на него только с помощью foo
.