【问题标题】:Is using nested std and posix namespaces undefined?使用嵌套的 std 和 posix 命名空间未定义吗?
【发布时间】: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 stdposix 命名空间,或者以下内容也未定义:

namespace HelloWorld {
    namespace std {
        void terminate();
    }
}

也许是因为我的母语是英语,但是这些规则的措辞在这方面似乎有点模糊。

【问题讨论】:

  • 该规则仅适用于顶级命名空间。但是使用名为例如的命名空间std 在另一个命名空间中会让阅读或维护您的代码的人感到困惑(将来可能包括您)。想想如果你这样做using namespace HelloWorld(上面的例子)会发生什么。
  • 不是真的,它没有扩展std,因为它是在不同的命名空间中完成的。这样做也会导致巨大的问题。虽然没有规则禁止在另一个命名空间(据我所知)中使用名称 std,但您不应该这样做,甚至不应该考虑这样做。

标签: c++ namespaces std language-lawyer


【解决方案1】:

这确实是一个有点晦涩难懂的英语规则。您会看到规则讨论了命名空间std 中的a 命名空间。为什么我们不谈论“命名空间std”或“命名空间std”?这是因为 std 是该命名空间的(唯一)名称。比较“总统”、“总统”、“特朗普总统”。

所以是的,namespace std 唯一地指代那个顶级命名空间。

【讨论】:

    猜你喜欢
    • 2011-01-06
    • 1970-01-01
    • 2020-08-07
    • 2021-12-23
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    相关资源
    最近更新 更多