Cxx-prettyprint (para contêineres padrão) define seus operadores de saída dentro do namespace std - isso é uma violação padrão?

Eu tenho usado com sucessocxx-prettyprint: Uma impressora bonita de contêiner C ++ para registrar valores de contêiner. (Veja tambémRecipientes C ++ STL com impressão bonita) Está funcionando como um encanto em nosso compilador VS-2005 (VC8). (com o cabeçalho prettyprint98.hpp)

Ao estudar sua interoperabilidade com o Boost.Format, descobri, para minha surpresa, que ele simplesmente funciona imediatamente, quandooutras perguntas sugerem que não deveria porque a ADL deve falhar para um operador de saída fornecido pelo usuário.

Olhando para ocabeçalho cxx-pp Eu descobri que simplesmente funciona porque a biblioteca nãodefinir seu (s) operador (es) de saídadentro astd namespace:

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;
    }
....

Adicionando algo aostd espaço para nome éformalmente UB:

[C++11: 17.6.4.2.1/1]: O comportamento de um programa C ++ é indefinido se ele incluir declarações ou definições no espaço para nomestd ou para um espaço para nome no espaço para nomestd salvo indicação em contrário. Um programa pode adicionar uma especialização de modelo para qualquer modelo de biblioteca padrão ao namespace std apenas se a declaração depender de um tipo definido pelo usuário e a especialização atender aos requisitos de biblioteca padrão do modelo original e não for explicitamente proibida.

Então, isso é formalmente no cxx-pp UB, ou é uma especialização de modelo (não me parece uma).

Comentários sobre o impacto prático disso, se UB, serão muito bem-vindos.

questionAnswers(0)

yourAnswerToTheQuestion