Добавление типов в пространство имен std
Допустимо ли добавлять типы в std
Пространство имен. Например, я хочу TCHAR-содружественную строку, поэтому допустимо ли следующее?
#include <string>
namespace std
{
typedef basic_string<TCHAR> tstring;
}
Или я должен использовать свое собственное пространство имен?
7 ответов
Нет... часть пространства имен заключается в предотвращении конфликтов имен при обновлении.
Если вы добавите что-то в пространство имен std, ваш код может сломаться со следующим выпуском библиотеки, если они решат добавить что-то с тем же именем.
Разрешены только специализации. Так, например, вам разрешено специализироваться std::numeric_limits
для вашего типа. И это, конечно, должно произойти в пространстве имен std::
, Но ваш typedef не является специализацией, поэтому он вызывает неопределенное поведение.
[C++11: 17.6.4.2.1/1]:
Поведение программы на C++ не определено, если она добавляет объявления или определения в пространство именstd
или в пространство имен в пространстве именstd
если не указано иное. Программа может добавить специализацию шаблона для любого шаблона стандартной библиотеки в пространство имен std, только если объявление зависит от типа, определенного пользователем, и специализация соответствует требованиям стандартной библиотеки для исходного шаблона и явно не запрещена.
Вы должны использовать свое собственное пространство имен, так как добавление кода в стандартную библиотеку только запутает пользователей, которые будут искать в Интернете информацию об этом дополнении.
Все, что есть в std, должно быть только стандартной библиотекой и ничего больше.
Это интересный вопрос, потому что он полностью субъективен проекту и принятым инженерам стандартам кодирования.
Для одного программиста, почему бы и нет... просто будьте осторожны.
Для команд сделайте стандарт...
Для кроссплатформенного проекта, черт возьми, да.
В противном случае, nawdawg.
Официально стандарт гласит, что это "неопределенное поведение", и возможны всевозможные неприятности.
На практике это будет работать нормально, но вы все равно не должны этого делать. Что он покупает, кроме как вводить людей в заблуждение, что компилятор предоставляет что-то?
Я полностью согласен с другими ответами, в которых говорится, что вы должны помещать свои типы в свое собственное пространство имен, чтобы избежать неудачных конфликтов имен.
Тем не менее, я хотел уточнить, что иногда вы можете (и должны!) Добавлять вещи в пространство имен std. Это относится, например, к специализациям шаблонов метода std::swap, которые используются для обеспечения единообразного способа обмена объектами. Для получения дополнительной информации по этому вопросу, вы можете прочитать об идиоме без броска свопа.