Cxx-prettyprint (для стандартных контейнеров) определяет свои операторы вывода в пространстве имен std - это стандартное нарушение?

Я успешно используюcxx-prettyprint: контейнер C ++ Pretty-Printer регистрировать значения контейнера. (Смотрите такжеКонтейнеры Pretty-print C ++ STL) Это работает как шарм на нашем компиляторе VS-2005 (VC8). (с заголовком prettyprint98.hpp)

Изучая его совместимость с Boost.Format, я с удивлением обнаружил, что он просто работает из коробки, когдадругие вопросы предполагают, что это не должно потому что ADL не должен работать для предоставленного пользователем оператора вывода.

Глядя взаголовок cxx-pp Я обнаружил, что это просто работает, потому что библиотека делаетопределить его оператор (ы) выводавнутри std Пространство имен:

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

Добавление чего-то кstd пространство именформально UB:

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

Так, это в cxx-pp формально UB, или это специализация шаблона (мне это не кажется).

Комментарии относительно практического воздействия этого, если UB, будут очень приветствоваться.

Ответы на вопрос(0)

Ваш ответ на вопрос