【发布时间】:2011-01-29 13:43:18
【问题描述】:
如果我有一些为库本地对象定义的重载 ostream 运算符,它们可以转到 std 命名空间吗?如果我没有在 std 命名空间中声明它们,那么我必须使用using ns:: operator <<。
作为一个可能的后续问题,是否有任何运算符应该转到标准或全局命名空间?
【问题讨论】:
标签: c++ operators namespaces conventions
如果我有一些为库本地对象定义的重载 ostream 运算符,它们可以转到 std 命名空间吗?如果我没有在 std 命名空间中声明它们,那么我必须使用using ns:: operator <<。
作为一个可能的后续问题,是否有任何运算符应该转到标准或全局命名空间?
【问题讨论】:
标签: c++ operators namespaces conventions
根据 Koenig Lookup(C++ 标准 3.4.2)operator<< 将在参数的命名空间中进行搜索。无需在std 命名空间中声明。
【讨论】:
operator<<( ..., MyClass ) 应该与MyClass 在同一个命名空间中。您应该将其视为MyClass 接口的一部分,即使它恰好(必然)是一个非成员函数。
几个参考:
【讨论】:
C++ 标准明确禁止您在 std 命名空间中声明自己的构造。
【讨论】:
std::swap 也不例外。您可以为任何标准库模板提供专业化。
std::hash 应该被重载以支持std::unordered_map。谁能提供一个明确的链接,指向 C++ Std 禁止在 std 命名空间中声明的位置?
将任何内容(类型、运算符等)声明为您不拥有的命名空间的一部分通常是一种不好的做法。这可能会对使用您的图书馆的人产生意想不到的后果。更好的解决方案是定义您自己的命名空间,并在需要组合解决方案时同时导入 std 和您的命名空间。
【讨论】: