【发布时间】:2010-10-16 11:16:12
【问题描述】:
因此,C++ 允许重载一元 operator &(地址)。当operator & 被合理地超载时,您是否知道任何真实世界 示例?第二个更具体的问题是,您是否知道任何现实世界示例,当operator & 在保留地址语义的同时被合理地重载? TIA
【问题讨论】:
-
@Johannes:谢谢!我从来不知道谷歌代码搜索。很遗憾我不能接受评论作为答案:)
因此,C++ 允许重载一元 operator &(地址)。当operator & 被合理地超载时,您是否知道任何真实世界 示例?第二个更具体的问题是,您是否知道任何现实世界示例,当operator & 在保留地址语义的同时被合理地重载? TIA
【问题讨论】:
我有 operator &() 的 207 个真实世界示例:Code search 1、Code search 2。
包括SafeInt<>(获取底层裸整数)、boost::gil(显然也是为了产生原始数据)、Mozilla(说“定义 operator& 是有风险的,但是,嘿,我们知道我们是什么”正在做。”)、wxWidgets、Armagetron 等等。
似乎有些人使用迭代器习语&*it 来获取原始引用或向后指针,并编写*&it 来获取原始引用和&it 来获取原始指针。
请注意,一旦您的类型重载 operator& 并返回与内置运算符不同的内容,您的类型就不再是 CopyConstructible(在 C++03 中 - C++0x 似乎已经解除了它),因此不能不再用作标准容器中的元素类型。
【讨论】:
似乎在 ATL 中使用,例如 http://msdn.microsoft.com/en-us/library/5s6et3yb.aspx
【讨论】:
我不知道一个具体的例子,但我可以想象一个容器类,你可能想要返回一个智能指针或迭代器。不过,我并不是说这一定是有道理的。
【讨论】:
*&pObj 不会让你回到你开始的地方!
重载它的一个很好的理由可能是使其成为private,以防止用户使用它。我想不出任何你想防止这种情况发生的实际例子,但这似乎是重载它的最合乎逻辑的理由。
【讨论】:
当一个对象有一个特殊用途的智能指针时,我做过一次。 operator& 悄悄地将堆栈分配的对象“提升”为基于堆的智能指针版本,一旦对象位于指针内,此运算符的行为就会有所不同。
我没有代码了,但当时有 一个原因。这当然不是一个掉以轻心的决定,这条路两旁都是尸体。
【讨论】:
在编写与 Direct3D 交互的类时,我重载了此运算符。这是一个智能指针类,需要从 operator& 返回 T**,以便它可以在需要指针到指针的函数中使用。 T** 语义很少见,但在某些情况下确实需要它们。
【讨论】: