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, будут очень приветствоваться.