2016-12-09 8 views
4

Нить на SO говорит, что extending std is UB (хорошо, если вы, конечно, не стандартные авторы). Но время от времени std счастливо расширяется. Когда все в порядке?C++ Когда можно расширить пространство имен `std`?

+0

related/dupe: http://stackoverflow.com/questions/320798/adding-types-to-the-std-namespace – NathanOliver

+0

@NathanOliver связал, но не обманул. Я был бы удивлен, если бы это был совершенно новый вопрос. Но это определенно хороший. – Walter

+0

Что вы можете сделать, это предоставить специализации для определенных шаблонов, например 'std :: numeric_limits '. – Walter

ответ

5

Единственный случай, когда это ОК, чтобы добавить определение в std пространства имен является специализация шаблона, который уже существует в пространстве имен и явно создать экземпляр шаблона , Однако, только если они зависят от определенного пользователем типа.

[namespace.std] (проект стандарта):

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

  2. Поведение C++ программы не определен, если он объявляет

    (2,1) явная специализация любой функции члена стандартного шаблона класса библиотеки или

    (2,2) явная специализация любого шаблон элемента-члена стандартного класса библиотеки или шаблон класса, или

    (2.3) явная или частичная специализация любого шаблона класса элемента стандартного класса библиотеки или шаблона класса.

    Программа может явно создавать шаблон, определенный в стандартной библиотеке, только если декларация зависит от имени определяемого пользователем типа, и экземпляр соответствует стандартным требованиям библиотеки для исходного шаблона.


В качестве примера стандартных шаблонов, которые явно предназначены для быть расширены для определенных пользователем типов: std::hash и std::iterator_traits.

+0

plain copy from cppreference ... – Walter

+0

Спасибо, я собирался спросить у @ Jarod42 список «те из« std », которые этого ожидают», но это достаточно хорошо. –

+0

Я расширяю пространство имен 'std' с помощью функции' make_unique' для C++ 11, как написано [здесь] (http://stackoverflow.com/questions/17902405/how-to-implement-make-unique-function-in С11). Это нормально? –

2

Вы можете поместить специализированные шаблоны для своих пользовательских типов данных.

В качестве примера: собственные specialzations из std::hash для std::unordered_map