Почему добавление имен в поведение пространства имен std
undefined?
Очевидный ответ - "потому что стандарт говорит так", например. в С++ 14 [namespace.std] 17.6.4.2.1/1:
Поведение программы на С++ undefined, если оно добавляет объявления или определения в пространство имен
std
или к пространство имен в пространстве именstd
, если не указано иное....
Однако меня действительно интересовали бы причины этого решения. Я могу, конечно, понять, что добавление перегрузок имен уже в std
может привести к поломке; но почему добавляет новые, несвязанные имена проблемы?
Программы уже могут наносить ущерб внутри std
с помощью макросов, поэтому практически все стандартные реализации библиотек должны состоять исключительно из зарезервированных имен (double-underscore и start-underscore-follow-by-capital) общественные части.
Мне действительно будет интересна ситуация, когда что-то вроде этого может быть проблематичным:
namespace std
{
int foo(int i)
{ return i * 42; }
}
#include <algorithm> // or one or more other standard library headers
когда это совершенно законно, и стандартная библиотека должна справиться:
#define foo %%
#include <algorithm> // or one or more other standard library headers
В чем причина этого undefined Поведения?