Добавление типов в пространство имен 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, которые используются для обеспечения единого способа обмена объектами. Для получения дополнительной информации по этому вопросу вы можете прочитать о неперебрасывающейся иконой обмена.