【发布时间】:2017-02-02 10:21:18
【问题描述】:
根据Extending the std namespace 和[namespace.constraints] 上的(现已失效的)StackOverflow 文档:
除非另有说明,否则如果 C++ 程序将声明或定义添加到命名空间
std或命名空间 std 内的命名空间,则其行为未定义。
和
除非另有说明,否则如果 C++ 程序将声明或定义添加到命名空间
posix或命名空间posix内的命名空间,则其行为未定义。命名空间posix保留供 ISO/IEC 9945 和其他 POSIX 标准使用。
这些规则是否仅适用于 global std 和 posix 命名空间,或者以下内容也未定义:
namespace HelloWorld {
namespace std {
void terminate();
}
}
也许是因为我的母语是英语,但是这些规则的措辞在这方面似乎有点模糊。
【问题讨论】:
-
该规则仅适用于顶级命名空间。但是使用名为例如的命名空间
std在另一个命名空间中会让阅读或维护您的代码的人感到困惑(将来可能包括您)。想想如果你这样做using namespace HelloWorld(上面的例子)会发生什么。 -
不是真的,它没有扩展
std,因为它是在不同的命名空间中完成的。这样做也会导致巨大的问题。虽然没有规则禁止在另一个命名空间(据我所知)中使用名称std,但您不应该这样做,甚至不应该考虑这样做。
标签: c++ namespaces std language-lawyer