Cxx-prettyprint (für Standardcontainer) definiert seine Ausgabeoperatoren im Namespace std. Handelt es sich um eine Standardverletzung?
Ich habe erfolgreich verwendetcxx-prettyprint: Ein C ++ Container Pretty-Printer Containerwerte zu protokollieren. (Siehe auchPretty-Print-C ++ - STL-Container) Es funktioniert wie ein Zauber auf unserem VS-2005 (VC8) Compiler. (mit dem prettyprint98.hpp-Header)
Als ich die Interoperabilität mit Boost.Format studierte, stellte ich zu meiner Überraschung fest, dass es sofort funktioniert, wennAndere Fragen deuten darauf hin, dass dies nicht der Fall sein sollte da ADL für einen vom Benutzer angegebenen Ausgabeoperator fehlschlagen sollte.
Ein Blick in diecxx-pp-Header Ich fand, dass es einfach funktioniert, weil die Bibliothek es tutDefinieren der AusgabeoperatorenInnerhalb dasstd
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;
}
....
Dem etwas hinzufügenstd
Namespace istformell UB:
[C++11: 17.6.4.2.1/1]:
Das Verhalten eines C ++ - Programms ist undefiniert, wenn es dem Namespace Deklarationen oder Definitionen hinzufügtstd
oder zu einem Namespace innerhalb des Namespacestd
Falls nicht anders angegeben. Ein Programm kann dem Namespace std nur dann eine Vorlagenspezialisierung für eine Standardbibliotheksvorlage hinzufügen, wenn die Deklaration von einem benutzerdefinierten Typ abhängt und die Spezialisierung den Standardbibliotheksanforderungen für die ursprüngliche Vorlage entspricht und nicht ausdrücklich untersagt ist.
Also, ist das in cxx-pp formal UB, oder ist es eine Template-Spezialisierung (es scheint mir keine zu sein)?
Kommentare zu den praktischen Auswirkungen, wenn UB, wären sehr willkommen.