Ich bin zwar kein Experte für den C++-Standard, aber ich werde meinen Kopf hinhalten und versuchen, Ihre Frage zu beantworten. Ich nehme an, dass die Verwendung von namespace N = A
innerhalb einer Klassendeklaration verstößt gegen die Definition, wie ein Klassenmitglied definiert werden sollte.
Der C++ Standard definiert ein Klassenmitglied als
member-specification:
member-declaration member-specification_opt
access-specifier : member-specification_opt
member-declaration:
decl-specifier-seq_opt member-declarator-list_opt ;
function-definition ;opt
::opt nested-name-specifier templateopt unqualified-id ;
using-declaration
static_assert-declaration
template-declaration
member-declarator-list:
member-declarator
member-declarator-list , member-declarator
member-declarator:
declarator pure-specifier_opt
declarator constant-initializer_opt
identifier_opt : constant-expression
pure-specifier:
= 0
constant-initializer:
= constant-expression
Der wichtigste Punkt ist die =
in der Deklaration erwartet der Compiler entweder einen reinen Spezifizierer oder eine Konstanten-Initialisierungsanweisung, und da die Zeile nicht mit einer Null endet, wenden wir in diesem Fall keinen reinen Spezifizierer an.
Die Analyse der namespace N = A
Deklaration sieht der Compiler dies als
declarator = constant-expression
Und da namespace
ein Schlüsselwort ist, kann es nicht verwendet werden.
typedef
ist erlaubt, weil (aus dem Standard)
Verschachtelte Typen sind Klassen und Aufzählungen, die in der Klasse definiert sind, und beliebige Typen, die mit Hilfe einer typedef-Deklaration als Mitglieder deklariert werden.