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

Другие вопросы по тегам