因此,C ++允许重载一元operator &
(地址)。当operator &
被正确重载时,您是否了解任何 真实世界 示例?第二个更具体的问题是,在保留地址语义的同时operator &
被正确重载时,您是否了解任何 真实世界 示例? TIA
答案 0 :(得分:5)
我有operator &()
:Code search 1,Code search 2的207个真实世界示例。
包括SafeInt<>
(以获取底层的裸整数),boost::gil(显然也是为了产生原始数据),Mozilla(说“定义运算符&amp;有风险,但是,嘿,我们知道我们在做什么。“),wxWidgets,Armagetron以及更多。
似乎有些人使用迭代器习语&*it
向后获取原始引用或指针,并编写*&it
以获取原始引用,并&it
获取原始指针。
请注意,一旦你的类型重载operator&
并返回与内置运算符不同的东西,你的类型就不再是CopyConstructible了(在C ++ 03中 - C ++ 0x似乎已经解除了它),并且所以不能再用作标准容器中的元素类型。
答案 1 :(得分:4)
答案 2 :(得分:1)
我不知道一个具体的例子,但我可以想象一个容器类,你可能想要返回一个智能指针或迭代器。我不是说这必然是有道理的。
答案 3 :(得分:1)
使其超载的一个好理由可能是使其private
,以防止用户使用它。我不能想到你想要阻止它的任何现实世界的例子,但它似乎是超载它的最合理的理由。
答案 4 :(得分:1)
当一个对象有一个特殊用途的智能指针时,我做了一次。 operator&
将堆栈分配的对象静静地“提升”为基于堆的智能指针版本,并且一旦对象在指针内部,此运算符的行为就会不同。
我不再拥有代码了,但当时是的原因。这当然不是一个轻率的决定,这条道路上布满了尸体。
答案 5 :(得分:0)
在编写用于与Direct3D交互的类时,我重载了此运算符。这是一个智能指针类,需要从运算符&amp;这样它就可以用在期望指向指针的函数中。 T **语义很少见,但在某些情况下确实需要它们。