Я не эксперт по C ++ Standard, но я выложу свою шею и попробую ответить на ваш вопрос.Я предполагаю, что использование namespace N = A
в объявлении класса противоречит определению того, как должен быть определен член класса.
Стандарт C ++ определяет член класса как
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
.Важным моментом, являющимся =
в объявлении, компилятор ожидает либо оператор чистого спецификатора, либо оператор константы-инициализатора, и поскольку строка не заканчивается на ноль, в этом случае мы не применяем чистый спецификатор.
Анализируя объявление namespace N = A
, компилятор видит это как
declarator = constant-expression
И поскольку namespace
является ключевым словом, его нельзя использовать.
typedef
разрешено, потому что (из стандарта)
Вложенные типы - это классы и перечисления, определенные в классе, и произвольные типы, объявленные как члены с помощью объявления typedef.