Was sind die Gründe, warum das Erweitern des Standardnamensbereichs als undefiniertes Verhalten gilt?

Warum werden dem @ Namen hinzugefügstd Namespace undefiniertes Verhalten?

Die offensichtliche Antwort lautet "weil der Standard dies sagt", z. in C ++ 14 [Namespace.std] 17.6.4.2.1 / 1:

Das Verhalten eines C ++ - Programms ist undefiniert, wenn es dem Namespace @ Deklarationen oder Definitionen hinzufügstd oder zu einem Namespace innerhalb von Namespacestd Falls nicht anders angegeben. ...

Ich würde mich jedoch sehr für die Gründe für dieses Urteil interessieren. Ich kann natürlich verstehen, wie man bereits in @ Überladungen von Namen hinzufüstd könnte das Verhalten stören; Aber warum ist das Hinzufügen neuer, nicht verwandter Namen ein Problem?

Programme können bereits Verwüstungen in @ anrichtstd mit Makros, weshalb so ziemlich alle Standard-Bibliotheksimplementierungen nur aus reservierten Namen (doppelter Unterstrich und beginnender Unterstrich, gefolgt von Großbuchstaben) für alle nicht öffentlichen Teile bestehen müssen.

Ich wäre wirklich an einer Situation interessiert, in der so etwas problematisch sein kann:

namespace std
{
  int foo(int i)
  { return i * 42; }
}

#include <algorithm>  // or one or more other standard library headers

wenn dies vollkommen legal ist und die Standardbibliothek damit umgehen muss:

#define foo %%

#include <algorithm>  // or one or more other standard library headers

Was ist der Grund für dieses undefinierte Verhalten?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage