运算符 << 执行哪个命名空间(流)去?
如果我有一些为库本地对象定义的重载 ostream 运算符,它们可以转到 std 命名空间吗?如果我不在 std 命名空间中声明它们,那么我必须使用 using ns::operator <<
。
作为一个可能的后续问题,是否有任何运算符应该进入标准或全局命名空间?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
根据 Koenig Lookup (C++ Standard 3.4.2)
operator<<
将在参数的命名空间中搜索。无需在std
命名空间中声明它。According to Koenig Lookup (C++ Standard 3.4.2)
operator<<
will be searched in namespaces of arguments. No need to declare it instd
namespace.operator<<( ..., MyClass )
应与MyClass
位于同一命名空间中。您应该将其视为 MyClass 接口的一部分,即使它恰好(必然)是非成员函数。一些参考资料:
operator<<( ..., MyClass )
should go in the same namespace asMyClass
. You should think of it as part of the interface ofMyClass
, even though it happens to be (necessarily) a non-member function.A couple of references:
C++ 标准明确禁止您在 std 命名空间中声明您自己的构造。
The C++ Standard explicitly forbids you from declaring your own constructs in the std namespace.
将任何内容(类型、运算符等)声明为您不拥有的命名空间的一部分通常是一种不好的做法。这可能会给使用您的库的人带来意想不到的后果。更好的解决方案是定义您自己的命名空间,并在需要组合解决方案时导入
std
和您的命名空间。It is generally a bad practice to declare anything (types, operators, etc ...) to be a part of a namespace you do not own. This can have unexpected consequences for people consuming your library. A better solution is to define your own namespace and to import both
std
and your namespace when you need to combine solutions.