Cxx-prettyprint (para contenedores estándar) define sus operadores de salida dentro del espacio de nombres estándar - ¿es esto una violación estándar?

He estado usando exitosamentecxx-prettyprint: una impresora bonita de contenedores C ++ para registrar valores de contenedor. (Ver tambiénContenedores STL C ++ de impresión bonita) Funciona de maravilla en nuestro compilador VS-2005 (VC8). (con el encabezado prettyprint98.hpp)

Mientras estudiaba su interoperabilidad con Boost.Format, encontré para mi sorpresa que simplemente funciona de forma inmediata, cuandootras preguntas sugieren que no debería porque ADL debería fallar para un operador de salida proporcionado por el usuario.

Mirando hacia elencabezado cxx-pp Descubrí que simplemente funciona porque la biblioteca sídefinir su operador de salidadentro elstd espacio de nombres:

namespace std
{
    // Prints a print_container_helper to the specified stream.

    template<typename T, typename TChar, typename TCharTraits, typename TDelimiters>
    inline basic_ostream<TChar, TCharTraits> & operator<<(basic_ostream<TChar, TCharTraits> & stream,
                                                          const ::pretty_print::print_container_helper<T, TChar, TCharTraits, TDelimiters> & helper)
    {
        helper(stream);
        return stream;
    }
....

Agregar algo a lastd el espacio de nombres esformalmente UB:

[C++11: 17.6.4.2.1/1]: El comportamiento de un programa C ++ no está definido si agrega declaraciones o definiciones al espacio de nombresstd o a un espacio de nombres dentro del espacio de nombresstd a menos que se especifique lo contrario. Un programa puede agregar una especialización de plantilla para cualquier plantilla de biblioteca estándar al espacio de nombres estándar solo si la declaración 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.

Entonces, ¿es esto en cxx-pp formalmente UB, o es una especialización de plantilla (no me parece una)?

Comentarios sobre el impacto práctico de esto, si UB, serían muy bienvenidos.

Respuestas a la pregunta(0)

Su respuesta a la pregunta