Добавление типов в пространство имен std - PullRequest
16 голосов
/ 26 ноября 2008

Допустимо ли добавлять типы в пространство имен std. Например, я хочу TCHAR-дружественную строку, поэтому допустимо ли следующее?

#include <string>

namespace std
{
    typedef basic_string<TCHAR> tstring;
}

Или я должен использовать свое собственное пространство имен?

Ответы [ 7 ]

19 голосов
/ 26 ноября 2008

Разрешены только специализации. Так, например, вам разрешено специализировать std::numeric_limits для вашего типа. И это, конечно, должно произойти в пространстве имен std::. Но ваш typedef не является специализацией, поэтому он вызывает неопределенное поведение.

18 голосов
/ 26 ноября 2008

Нет ... частью пространства имен является предотвращение конфликтов имен при обновлении.

Если вы добавите что-то в пространство имен std, ваш код может сломаться со следующим выпуском библиотеки, если они решат добавить что-то с тем же именем.

16 голосов
/ 05 февраля 2012

[C++11: 17.6.4.2.1/1]: Поведение программы на C ++ не определено, если она добавляет объявления или определения в пространство имен std или в пространство имен в пространстве имен std, если не указано иное. Программа может добавить специализацию шаблона для любого стандартного шаблона библиотеки в пространство имен std, только если объявление зависит от типа, определенного пользователем, и специализация соответствует требованиям стандартной библиотеки для исходного шаблона и явно не запрещена.

3 голосов
/ 26 ноября 2008

Вы должны использовать свое собственное пространство имен, так как добавление кода в стандартную библиотеку только запутает пользователей, которые будут искать в Интернете информацию об этом дополнении.

Все, что находится в std, должно быть только стандартной библиотекой и ничего больше.

2 голосов
/ 23 апреля 2014

Это интересный вопрос, потому что он полностью субъективен проекту и принятым инженерами стандартам кодирования.

Для одного программиста, почему бы и нет ... просто будьте осторожны.

Для команд сделайте стандарт ...

Для кроссплатформенного проекта, черт возьми, да.

В противном случае, nawdawg.

2 голосов
/ 26 ноября 2008

Официально стандарт гласит, что это «неопределенное поведение», и возможны всевозможные неприятности.

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

1 голос
/ 26 ноября 2008

Я полностью согласен с другими ответами о том, что вы должны помещать свои типы в свое собственное пространство имен, чтобы избежать неудачных конфликтов имен.

Однако я хотел уточнить, что иногда , вы можете (и должны!) Добавлять вещи в пространство имен std. Это относится, например, к специализациям шаблонов метода std :: swap, которые используются для обеспечения единообразного способа обмена объектами. Для получения дополнительной информации по этому вопросу вы можете прочитать о идиоме non-throwing swap .

...