Почему у хроно есть собственное пространство имен?

Все остальное, что я видел до сих пор в стандартной библиотеке C++, находится в пространстве имен std. Если я использую что-то из std::chrono, я обычно превышаю лимит в 80 символов на строку — это не проблема, просто неудобно.

Итак, вот мой простой вопрос: почему заголовок хроно имеет собственное пространство имен?


person cschwan    schedule 18.11.2012    source источник
comment
Отбросьте ограничение в 80 символов, это уже не 80-е.   -  person GManNickG    schedule 18.11.2012
comment
На самом деле я ввел ограничение для себя после того, как не использовал его раньше. Если вы открываете отладчик слева от себя на ноутбуке с ограниченной шириной экрана, это довольно полезно. Также в редком случае, когда вы распечатываете свой код. В общем, я думаю, что код, который не умещается в одну 80-символьную строку, менее читаем, см., например, некоторые интерфейсы библиотек Java;)   -  person cschwan    schedule 19.11.2012
comment
Вам будет намного лучше, если вы разберетесь с этим в каждом конкретном случае. Если вставка строки в 80 символов вынуждает вас вводить неудобные разрывы, не делайте этого. Если разрыв строки на 23-м символе облегчает чтение, сделайте это. Нет единого номера.   -  person GManNickG    schedule 19.11.2012
comment
Или просто, знаете, namespace sc = std::chrono;   -  person KitsuneYMG    schedule 19.11.2012
comment
Поскольку сейчас 2010-е, новый лимит 2010-1900 = 110 символов в строке;)   -  person wjl    schedule 20.11.2012
comment
Руководство по стилю Google C++ гласит: Каждая строка текста в вашем коде должна быть на не более 80 символов.   -  person kevinarpe    schedule 02.08.2016


Ответы (2)


Я был ведущим автором предложения по хронологии. Подпространство имен не было моим первым выбором только из-за многословия. Я ловлю себя на том, что пишу using namespace std::chrono почти каждый раз, когда использую это средство.

Однако это было очень спорное предложение. И многие люди, в том числе некоторые из моих соавторов, считали подпространство имен уместным. Я не возражал сильно против подпространства имен, потому что мы были в ситуации необходимости идти на компромисс или оказаться в таком же тупике, как Конгресс США. :⁠-⁠) Результатом такого тупика, вероятно, был бы timespec C11.

Boost экспериментировал с подпространствами имен гораздо более агрессивно, чем std, и один из ключевых авторов этой статьи также является автором библиотеки даты и времени boost, на основе которой развился chrono. Так что это, очевидно, будет иметь сильное влияние в направлении использования подпространства имен.

Забегая вперед, вполне возможно, что подпространство имен станет абсолютно необходимым. Представьте, если мы добавим календарные службы, которые включают аббревиатуру декабря: dec. Это будет напрямую противоречить:

ios_base& dec(ios_base& str);

в <ios>. В общем, я, вероятно, был не прав, не настаивая на подпространстве имен с самого начала. :⁠-⁠) В будущем будет интересно посмотреть, где комитет создает и не создает подпространства имен.

Обновление (6 лет спустя...)

Правда всегда удивительнее вымысла...

Поэтому я действительно предложил std::chrono::dec в качестве сокращения для December, думая, что это будет безопасно из-за вложенного пространства имен chrono. Но нет, комитет решил переименовать std::chrono::dec в std::chrono::December в процессе стандартизации из-за потенциальных конфликтов.

Так стоят ли вложенные пространства имен?

Я не знаю. Это обновление является точкой данных, а не мнением.

person Howard Hinnant    schedule 18.11.2012
comment
Будет ли толчок к перемещению существующих библиотек в их собственные подпространства имен для согласованности, а также помещение их в std (для обратной совместимости)? Обычно рекомендуется не использовать using namespace. Изменят ли это подпространства имен под std, и хорошо ли это? Есть законные причины не использовать его, но chrono слишком громоздко без using namespace std::chrono. - person David; 28.02.2013
comment
@Dave: Будущее всегда трудно предсказать (особенно когда речь идет о том, что будет делать комитет), но я сомневаюсь, что комитет будет модифицировать подпространства имен для существующих подписей. - person Howard Hinnant; 28.02.2013
comment
@HowardHinnant, у меня есть вопрос об ограничениях внутренней памяти классов time_point и duration - person ceztko; 30.05.2017
comment
@HowardHinnant, просто любопытно, но почему хроно было очень спорным предложением? (И, кстати, спасибо за помощь в его написании.) - person Dan; 28.06.2018
comment
@ Дэн. Значительное количество людей в комитете хотели стандартизировать POSIX timespec (struct с полем для секунд и полем для наносекунд). Это решение было простым и основывалось на большом практическом опыте. И у него есть совместимость с C. Когда был написан N2661, была аудитория, для которой я писал. По сравнению с гораздо более сложной спецификацией <chrono> продать ее было непросто. Я попытался подчеркнуть, что пользовательский интерфейс будет проще и менее подвержен ошибкам. - person Howard Hinnant; 28.06.2018
comment
@HowardHinnant, это интересно. Спасибо за ответ. - person Dan; 29.06.2018

Есть и другие пространства имен, например std::placeholders. В конечном счете, в C++03 комитет не пошел на подпространства имен, но теперь совершенно очевидно, что пространство имен std становится сильно перегруженным. Таким образом, я ожидаю, что многие предложения библиотек для C++14 будут использовать подпространство имен для более крупных организаций компонентов.

person Puppy    schedule 18.11.2012
comment
Не могли бы вы подробнее рассказать о массивной перегрузке? Я имею в виду, это правда, что с C++11 стандартная библиотека растет, а вместе с ней и члены в пространстве имен std. Но я не вижу причин, по которым, например, a в std::subnamespace, если a в std еще нет. - person cschwan; 18.11.2012
comment
Потому что тогда вы получите std::a и std::sub::a вместо std::sub1::a и std::sub2::a. Что еще более важно, просто уже используется целая куча a. - person Puppy; 18.11.2012