::S
is a qualified-id.
In the qualified-id ::S::f
, S::
is a nested-name-specifier.
In informal terms1, a nested-name-specifier is the part of the id that
- begins either at the very beginning of a qualified-id or after the initial scope resolution operator (
::
) if one appears at the very beginning of the id and
- ends with the last scope resolution operator in the qualified-id.
Very informally1, an id is either a qualified-id or an unqualified-id. If the id is a qualified-id, it is actually composed of two parts: a nested-name specifier followed by an unqualified-id.
Given:
struct A {
struct B {
void F();
};
};
A
is an unqualified-id.
::A
is a qualified-id but has no nested-name-specifier.
A::B
is a qualified-id and A::
is a nested-name-specifier.
::A::B
is a qualified-id and A::
is a nested-name-specifier.
A::B::F
is a qualified-id and both B::
and A::B::
are nested-name-specifiers.
::A::B::F
is a qualified-id and both B::
and A::B::
are nested-name-specifiers.
[1] This is quite an inexact description. It's hard to describe a grammar in plain English...
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…