Есть ли конкретная причина, по которой в C ++ не разрешены объявления вложенных пространств имен? - PullRequest
25 голосов
/ 30 августа 2010

Стандарт не допускает код, подобный этому:

namespace Hello::World {

//Things that are in namespace Hello::World

}

и вместо этого требуется

namespace Hello { namespace World {

//Things that are in namespace Hello::World

}}

Что является обоснованием? Было ли это просто не продумано в то время, или есть какая-то конкретная причина, по которой оно не включено?

Кажется, что первый синтаксис более прямо выражает, в каком пространстве имен он должен находиться, поскольку объявление имитирует фактическое использование пространства имен в более позднем коде. Это также приводит к уменьшению отступов, если вам не повезло использовать инструмент для подсчета «тупых» скобок.

Ответы [ 5 ]

23 голосов
/ 30 августа 2010

Причина, скорее всего, «потому что так развивался язык».

По крайней мере одно предложение ( "Предложение по определению вложенного пространства имен" в 2003 году) разрешило определения вложенного пространства имен, но оно не было выбрано для включения в C ++ 0x.

14 голосов
/ 25 сентября 2016

Определение вложенного пространства имен является частью рабочего проекта C ++ 17.
Эта тема упоминается в предложении в качестве примера этой функции, являющейся требованием программистов оригинал n4026 обновленная версия: n4230 .

Текущая последняя версия: n4567 (пункт 7.3.1, пункт 10)

7.3.1 Определение пространства имен
...
10 Определение вложенного пространства имен с спецификатором пространства вложенных имен E, идентификатором I и телом пространства имен B эквивалентно namespace E { namespace I { B } }

Пример :

namespace A::B::C {
  int i;
}    The above has the same effect as:

namespace A {
  namespace B {
    namespace C {
      int i;
    }
  }
}

Поддержка компилятора

GCC, поскольку версия 6 включить с помощью -std=c++1z
Visual C ++ с 2015, обновление 3 включить с помощью /std:c++latest
Clang с версия 3.6 включить с помощью -std=c++1z

11 голосов
/ 30 августа 2010

Полагаю, вы бы предпочли, чтобы это было так, чтобы, учитывая namespace X::Y, оно было эквивалентно "пространству имен X {пространству имен Y`. Что звучит хорошо на его поверхности, но рассмотрим угловой случай:

namespace Hello {
   namespace {
      namespace World {}
   }
}

// Does this refer to an existing namespace? Or does it define a new one?
namespace Hello::World {}
2 голосов
/ 30 августа 2010

Как я уже говорил в этом "возможном дублировании" потока, в C ++ квалифицированные имена зарезервированы для ссылки на ранее объявленные сущности.Это относится как к «источникам» квалифицированных имен: классам и пространствам имен.

0 голосов
/ 30 августа 2010

Я думаю, что это был выбор дизайна.

Первый синтаксис выглядит хорошо. Я хотел бы иметь это тоже. Однако второй является более структурированным. Вы не создаете вложенные пространства имен следующим образом:

Hello::World::Everyone::Great {

}

Вы объявите это заранее?

...