Стандарт не допускает код, подобный этому:
namespace Hello::World {
//Things that are in namespace Hello::World
}
, и вместо этого требует
namespace Hello { namespace World {
//Things that are in namespace Hello::World
}}
Что такое обоснование? Было ли это просто не продумано в то время, или есть какая-то конкретная причина, по которой он не включен?
Кажется, что первый синтаксис более прямо выражает, в каком пространстве имен предполагается находиться, поскольку объявление имитирует фактическое использование пространство имен в последующем коде. Это также приводит к меньшему отступу, если вам не повезло использовать «тупой» инструмент отступа для подсчета скоб.
Причина, скорее всего, "потому что так развивался язык".
Было как минимум одно предложение ("Предложение по определению вложенного пространства имен" в 2003 г.) разрешить вложенные определения пространств имен, но оно не было выбрано для включения в C++0x.
Я полагаю, вы бы предпочли, чтобы с учетом пространства имен 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 {}
Как я уже говорил в теме "возможный дубликат", в C++ полные имена зарезервированы для ссылки на ранее объявленные сущности. Это относится к обоим «источникам» полных имен: классам и пространствам имен.
Я думаю, что это был выбор дизайна.
Первый синтаксис выглядит хорошо. Я бы тоже хотел иметь. Однако второй вариант более структурирован. Вы не создаете вложенные пространства имен таким образом:
Hello::World::Everyone::Great {
}
Вы объявите это заранее?