может ли пространство имен быть определено в пространстве имен и затем расширено в одном из его встроенных пространств имен?
Нет. Во втором примере, когда компилятор видит определение N3
внутри N2
, поиск N3
находит N3
, который был объявлен вне N2
, но что N3
не было "введено впространство имен, в котором появляется именованное-пространство имен-определений "(поскольку оно не внутри N2
), или" введено в элемент набора встроенных пространств имен этого пространства имен ", поскольку набор встроенных пространств имен N2
является набором транзитивновстроенные пространства имен внутри N2
. Таким образом, это новое определение N3
не расширяет предыдущее.
Может ли пространство имен быть определено во встроенном пространстве имен, а затем расширено во включающем его пространстве имен?
Да. В вашем первом примере N3
при поиске находит N2::N3
, который был «введен в член набора встроенных пространств имен», поскольку N2
является частью набора встроенных пространств имен N1
.
Мы можем понять обоснование этой кажущейся асимметрии следующим образом: во втором примере, когда N3
изначально определен, он определяется как член N1
, а не член любого встроенного пространства именN1
. Позже, когда определяется N2::N3
, если он будет расширяться N1::N3
, это будет задним числом , что сделает N3
членом N2
, что противоречит здравому смыслу и поэтому запрещено. В первом примере N3
первоначально определяется как член встроенного пространства имен N2
, и нет проблемы с его расширением вторым определением позже. (Хотя я не вижу очевидной причины, почему это полезно.)