【发布时间】:2011-02-12 18:32:31
【问题描述】:
突然在this article ("problem 2") 中看到一条声明,如果该类具有重载的operator&(),则 C++ 标准禁止使用 STL 容器来存储类的元素。
重载了operator&()can indeed be problematic,但看起来默认的“address-of”运算符可以通过a set of dirty-looking casts that are used in boost::addressof() 轻松使用,并且被认为是可移植的和标准编译的。
为什么在存在boost::addressof() 解决方法的情况下,禁止对存储在 STL 容器中的类使用重载的 operator&()?
【问题讨论】:
-
出于好奇(没有批评,真的只是好奇),你会在哪里重载地址运算符?
-
@roe:在像 ATL::CComPtr (msdn.microsoft.com/en-us/library/ezzw7k98(VS.80).aspx) 这样有意义的类中。您经常使用它们而不是原始指针。您希望为 CComPtr
调用类似 HRESULT GetStuff( IInterface** )的函数,并且需要有一种方法来检索封装指针的地址或重载operator&()。 -
快速浏览到标准中关于容器的章节后,我没有找到这样的说法。免责声明:我刚刚浏览过,如果不是粗体字母和/或句子的开头,我可能会错过它:)
-
@David:CopyConstructible 要求 (20.1.3) 指定
&t的类型为T*并且“表示T的地址”。这在技术上并不禁止运算符重载,但确实禁止更改其行为。 -
@Mike:谢谢,当您浏览文档时会发生这种情况:)
标签: c++ stl operators operator-overloading