重载一元算子和放大器是否有意义?

时间:2010-10-16 11:16:12

标签: c++ operator-overloading

因此,C ++允许重载一元operator &(地址)。当operator &被正确重载时,您是否了解任何 真实世界 示例?第二个更具体的问题是,在保留地址语义的同时operator &被正确重载时,您是否了解任何 真实世界 示例? TIA

6 个答案:

答案 0 :(得分:5)

我有operator &()Code search 1Code 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 **语义很少见,但在某些情况下确实需要它们。