Добавление типов в пространство имен std

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

#include <string>

namespace std
{
    typedef basic_string<TCHAR> tstring;
}

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
17
0
4 550
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

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

Я не уверен, что это запутает пользователей - на самом деле они могут ожидать, что тип std :: basic_string будет в std. Думаю, трудный вызов.

Rob 26.11.2008 17:13

Нет, Клаим прав. Вы не должны ничего добавлять в пространство имен std. Пользователи могут использовать ожидать basic_string в std, но это НЕ является частью библиотеки std, и они не найдут ничего о нем в опубликованной документации для данной реализации std. Правильный способ - использовать собственный ns.

Zach Burlingame 26.11.2008 17:36

Я должен был найти это. basic_string фактически определен как часть пространства имен std на странице 384 ISO / IEC 14882: 1998.

Zhro 10.02.2016 03:09
Ответ принят как подходящий

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

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

Это также нарушает стандарт afaik. Пространство имен std священно. (Помимо специализации существующих функций std) :)

jalf 26.11.2008 18:14

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

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

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

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

MvG 16.02.2013 01:55

@MvG, ответ правильный. Мой пример плох и плох. Я заменю его.

Johannes Schaub - litb 16.02.2013 03:01

Чем numeric_limits отличается от swap в этом отношении?

Dan Nissenbaum 27.01.2014 18:29

@DanNissenbaum, я не знаю правил для swap. Если не разрешено его специализировать, это может быть связано с тем, что ADL предоставляет превосходную альтернативу.

Johannes Schaub - litb 27.01.2014 21:52

Если я понимаю потенциальную интерпретацию open-std.org/jtc1/sc22/wg21/docs/papers/2001/n1289.html (ссылка на которую приведена в комментарии под stackoverflow.com/q/21384604/368896), то, возможно, в стандарте указано, что Unless otherwise specified, no global or non-member function in the standard library shall use a function from another namespace which is found through argument-dependent name lookup (3.4.2 [basic.lookup.koenig]) - в этом случае один должен помещает функции типичный в std, но, возможно, swap является `` примитивом '' особого случая, для которого ADL - это позволил как исключение?

Dan Nissenbaum 27.01.2014 22:18

@DanNissenbaum, я думаю, это очень вероятно. Поскольку вам не разрешается помещать перегрузки в сам std, и вы не можете частично специализировать шаблон функции (и поэтому вы не можете предоставить подкачку для вашего собственного шаблонного контейнера в качестве специализации), вам должно быть разрешено использовать здесь ADL.

Johannes Schaub - litb 27.01.2014 22:32

... Разве те же рассуждения не применимы к функции Любые (такой как numeric_limits, который вы используете в качестве примера)?

Dan Nissenbaum 27.01.2014 22:51

@Dan numeric_limits не является шаблоном функции, поэтому он не применяется. template<typename T> struct numeric_limits<MyNumberWrapper<T>> { ... }; можно записать отлично.

Johannes Schaub - litb 27.01.2014 23:04

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

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

[C++11: 17.6.4.2.1/1]: The behavior of a C++ program is undefined if it adds declarations or definitions to namespace std or to a namespace within namespace std unless otherwise specified. A program may add a template specialization for any standard library template to namespace std only if the declaration depends on a user-defined type and the specialization meets the standard library requirements for the original template and is not explicitly prohibited.

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

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

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

Для кроссплатформенного проекта, черт возьми.

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

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