Каковы причины, по которым расширение пространства имен std рассматривается как поведение undefined?

Почему добавление имен в поведение пространства имен 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 Поведения?

Ответы

Ответ 1

Вот несколько причин:

  • Даже если имена в заголовках должны быть убраны, чтобы избежать взаимодействия с макросами, это требование не существует для имени в исходных файлах, фактически реализующих код. Если реализация использует ::std::foo(int) как часть ее реализации, это будет нарушением одного правила определения.
  • Ожидается, что стандарт будет расти. Если имена могут быть добавлены в пространство имен std, любое имя, добавленное в стандартную библиотеку С++, было бы вероятным изменением. В некоторой степени это уже верно в том смысле, что любое такое имя может быть макросом, но считается приемлемым для их разрыва.
  • На самом деле нет необходимости добавлять пространство имен в пространство имен std: они могут быть добавлены в произвольное другое пространство имен, т.е. даже если приведенные выше мотивации не являются особенно сильными, ограничение не считается вопросом в любом форма.... и если есть причина добавить имя в пространство имен std, это явно влияет на поведение.