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?