为什么要将名称添加到
std
命名空间未定义的行为?
显而易见的答案是“因为标准如此”,例如在C++14[namespace.std]17.6.4.2.1/1中:
如果C++程序向名称空间添加声明或定义,则其行为是未定义的
标准
或发送到
命名空间内的命名空间
标准
除非另有规定。。。
然而,我对这一裁决的原因很感兴趣。我当然可以理解在中添加名称重载
标准
可能破坏行为;但为什么添加新的、不相关的名称是一个问题?
程序已经可以在内部造成破坏
标准
对于宏,这就是为什么几乎所有标准库实现都必须只包含所有非公共部分的保留名称(双下划线和起始下划线后跟大写)的原因。
我真的很想了解这样一种情况:
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
这种未定义行为的理由是什么?