2008-11-26 5 views
14

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

#include <string> 

namespace std 
{ 
    typedef basic_string<TCHAR> tstring; 
} 

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

ответ

17

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

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

3

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

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

+0

Я не уверен, что это смутит пользователей - на самом деле они могут ожидать, что тип std :: basic_string будет в std. Думаю, жесткого звонка. – Rob 2008-11-26 14:13:57

+0

Нет, Кайдж прав. Вы не должны добавлять ничего в пространство имен std. Пользователи могут * ожидать, что * basic_string будет в std, но он НЕ является частью библиотеки std, и они не найдут в нем ничего в опубликованной документации для данной реализации std. Правильный способ - использовать свои собственные ns. – 2008-11-26 14:36:20

+0

Мне пришлось это посмотреть. `basic_string` фактически определен как часть пространства имен` std` на стр. 384 ISO/IEC 14882: 1998. – Zhro 2016-02-10 00:09:13

2

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

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

15

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

1

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

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

13

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

2

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

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

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

Для проекта кросс-платформенной, ад да.

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