【问题标题】:Which namespace does operator<< (stream) go to?operator<< (stream) 去哪个命名空间?
【发布时间】:2011-01-29 13:43:18
【问题描述】:

如果我有一些为库本地对象定义的重载 ostream 运算符,它们可以转到 std 命名空间吗?如果我没有在 std 命名空间中声明它们,那么我必须使用using ns:: operator &lt;&lt;

作为一个可能的后续问题,是否有任何运算符应该转到标准或全局命名空间?

【问题讨论】:

    标签: c++ operators namespaces conventions


    【解决方案1】:

    根据 Koenig Lookup(C++ 标准 3.4.2)operator&lt;&lt; 将在参数的命名空间中进行搜索。无需在std 命名空间中声明。

    【讨论】:

    • 那么,如果我在全局命名空间中有来自外部 C 库的对象/类,我是否也应该在全局命名空间中声明运算符?
    • 我认为在其参数来自的命名空间中声明运算符是个好主意。
    【解决方案2】:

    operator&lt;&lt;( ..., MyClass ) 应该与MyClass 在同一个命名空间中。您应该将其视为MyClass 接口的一部分,即使它恰好(必然)是一个非成员函数。

    几个参考:

    【讨论】:

    • 将所有相关事物放在一个命名空间中的规则的例外是与 MyClass 相关的部分特化,例如,对于 std::hash、std::less、std::swap 等。在 ::std::.
    【解决方案3】:

    C++ 标准明确禁止您在 std 命名空间中声明自己的构造。

    【讨论】:

    • std::swap 是一个明显的例外。您被特别允许提供 std::swap 的模板特化,它必须驻留在 std 命名空间中
    • std::swap 也不例外。您可以为任何标准库模板提供专业化。
    • 还有std::hash 应该被重载以支持std::unordered_map。谁能提供一个明确的链接,指向 C++ Std 禁止在 std 命名空间中声明的位置?
    【解决方案4】:

    将任何内容(类型、运算符等)声明为您不拥有的命名空间的一部分通常是一种不好的做法。这可能会对使用您的图书馆的人产生意想不到的后果。更好的解决方案是定义您自己的命名空间,并在需要组合解决方案时同时导入 std 和您的命名空间。

    【讨论】:

      猜你喜欢
      • 2011-10-17
      • 2020-07-16
      • 2015-05-31
      • 2011-03-18
      • 2016-08-15
      • 2018-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多