Добавление типов в пространство имен std

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

#include <string>

namespace std
{
    typedef basic_string<TCHAR> tstring;
}

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

Официально, стандарт говорит, что "поведение undefined", и могут возникать всевозможные неприятные вещи.

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

Ответ 6

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

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

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

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

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

Ответ 7

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

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