Agregar tipos al espacio de nombres estándar

¿Es aceptable agregar tipos al std nombres std ? Por ejemplo, quiero una cadena amigable con TCHAR, ¿es aceptable lo siguiente?

 #include  namespace std { typedef basic_string tstring; } 

¿O debería usar mi propio espacio de nombres?

No … parte del punto de un espacio de nombres es evitar colisiones de nombres en la actualización.

Si agrega cosas al espacio de nombres estándar, entonces su código podría romperse con el próximo lanzamiento de la biblioteca si deciden agregar algo con el mismo nombre.

Solo se permiten especializaciones. Entonces, por ejemplo, puedes especializar std::numeric_limits para tu tipo. Y esto, por supuesto, debe suceder en namespace std:: . Pero su typedef no es una especialización, por lo que está causando un comportamiento indefinido.

[C++11: 17.6.4.2.1/1]: el comportamiento de un progtwig C ++ no está definido si agrega declaraciones o definiciones al espacio de nombres std o a un espacio de nombres dentro del espacio de nombres std menos que se especifique lo contrario. Un progtwig puede agregar una especialización de plantilla para cualquier plantilla de biblioteca estándar al espacio de nombre std solo si la statement depende de un tipo definido por el usuario y la especialización cumple con los requisitos de biblioteca estándar para la plantilla original y no está explícitamente prohibida.

Debe usar su propio espacio de nombres ya que agregar código a la biblioteca estándar solo confundirá a los usuarios que buscarán en línea la información sobre esa adición.

Todo lo que está en std debe ser solo la biblioteca estándar y nada más.

Oficialmente, el estándar dice que es un “comportamiento indefinido” y pueden ocurrir todo tipo de cosas desagradables.

En la práctica, funcionará bien, pero aún no deberías hacerlo. ¿Qué te compra, aparte de confundir a la gente de que algo es proporcionado por el comstackdor?

Esta es una pregunta interesante porque es completamente subjetiva para el proyecto y los estándares de encoding aceptados por los ingenieros.

Para un progtwigdor individual, ¿por qué no … solo tenga cuidado.

Para los equipos, haz un estándar …

Para un proyecto multiplataforma, infierno, sí.

De lo contrario, nawdawg.

Estoy totalmente de acuerdo con otras respuestas que dicen que debes poner tus tipos en tu propio espacio de nombres para evitar colisiones de nombres desafortunados.

Sin embargo, quería precisar que a veces , puede (¡y debería!) Agregar cosas en el espacio de nombres estándar. Este es el caso de las especializaciones de plantilla del método std :: swap, por ejemplo, que se utilizan para proporcionar una manera uniforme de intercambiar objetos. Para obtener más información sobre este tema, puede leer sobre el modismo de intercambio de no lanzar .