有什么合理的理由使一元运算符超负荷运算?

时间:2011-06-27 16:32:08

标签: c++ operator-overloading

好的,我一直是inspired to do some head punching。似乎超载operator&会导致不小的痛苦。

存在超载的合法案例?

(不能说我曾经这样做过......)

7 个答案:

答案 0 :(得分:52)

我似乎记得像智能指针类一样覆盖operator&,因为它想要返回包含指针的地址而不是智能指针对象的地址。不记得我在哪里看到它或者当时看起来是个好主意。

啊哈,记得:微软的CComPtr

修改:要概括,可能在以下条件下有意义:

  • 你有一个伪装成其他物体的物体。
  • 此对象可以获取指向它伪装成的事物的指针。

返回合法指针以外的任何内容都会违反principle of least astonishment

答案 1 :(得分:10)

重载一元&会使您的对象的行为类似于引用(在这方面)。

我很确定尝试提供内置引用的替代方案是一件愚蠢的事,特别是因为引用在C ++中根本不是对象,并且它们没有自己的地址。用户定义类型的实例不可避免地是对象,并且具有地址,即使您禁用获取该地址的常规方法也是如此。所以它永远不是一个完美的模仿。

但是,人们非常热衷于用户定义的指针替代品,所以我可以看看有人想要尝试它。我不确定他们是否会避免创建一种(错误)行为的方式,使其用户希望他们不会打扰。

答案 2 :(得分:10)

在lambda占位符表示法中表示&操作时非常有用,例如: &_1[_2]

答案 3 :(得分:8)

四年后,另一个答案。

我看到的另一个用途是当你背负C ++语言,但定义自己的语义。 Prime示例:Boost.Spirit。

Boost.Spirit,特别是用于解析的Qi,重载解析器上的运算符,以提供类似EBNF的语法来指定任意解析器对象。特别是,一元&运算符被重载以提供And-Predicate Parser

  

And-Predicate Parser(& a)

     

描述

     

语法谓词在评估另一个生产之前断言某个条件语法要满足。类似于语义谓词,eps,句法谓词不消耗任何输入。该   and-predicate,& a,是一个返回a的正语法谓词   零长度仅在其谓词匹配时才匹配。

使用示例:

  

基本前瞻示例:确保最后一个字符是a   分号,但不要消耗它,只是看看下一个字符:

test_phrase_parser("Hello ;", lit("Hello") >> &lit(';'), false);

简而言之,这里的一元&与指针毫无关系;它具有适用于Qi解析器对象的特定于域的语义。

答案 4 :(得分:7)

我在生成LLVM代码的DSL环境中做到了这一点。一个例子将说明。说xy是值(即value类型的对象)。然后表达式x+y向某些代码流发出ADD指令。很明智,表达式&x会发出一条指令来获取x的地址。

答案 5 :(得分:-1)

曾经我曾经超越过运营商& (不改变其行为)作为类的私有,以防止偶尔创建指向堆栈中创建的对象的智能指针。还不确定这是不是真的好主意......

答案 6 :(得分:-3)

您可以重载地址运算符以使其成为私有。这对于实现某种接力棒传递方案非常有用,其中不能使用接力棒的地址。如果接力棒的构造器被隐藏,这可以使接力棒的范围保持密闭。