Каковы причины, по которым расширение пространства имен 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
, это явно влияет на поведение.