有什么正当理由使一元运算符超载?


Answers:


53

我似乎还记得类似智能指针类之类的东西,operator&因为它想返回所包含的指针的地址,而不是智能指针对象的地址,所以它会覆盖。不记得我在哪里看到过它,或者当时它似乎不是一个好主意。

阿哈,记得:微软的CComPtr

编辑:概括地说,在以下情况下可能有意义:

  • 您有一个伪装成其他对象的对象。
  • 该对象可以获取一个伪装成事物的指针。

返回合法指针以外的任何东西都会违反最小惊讶原则


1
@Billy,距离我使用它已经很长时间了,我只是不记得它的优缺点。由于传递接口指针的地址是COM编程中的常见操作,因此似乎很合理。
Mark Ransom

包含指针的地址”是指包含指针,不是吗?
curiousguy

5
@curiousguy我不这么认为。包含的指针具有类型T *。由返回的指针operator&具有类型T **,并指向包含的指针。

2
CComPtr中的运算符和重载是一个危险的hack。仅当智能指针尚未初始化时,它才有效。否则,它已经拥有的对象将不会使其引用计数递减,并且会大量泄漏。在调试版本中,它实际上断言该指针已经为空,因为这种错误太常见了。
阿德里安·麦卡锡


10

一元重载&使您的对象的行为像一个引用(就此而言)。

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

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


但是isocpp.org/wiki/faq/references#overview-refs说:“即使经常使用底层汇编语言中的地址来实现引用,也请不要将引用视为指向对象的有趣指针。引用是对象。它不是指向对象的指针,也不是对象的副本。它是对象。”
Destructor

1
@PravasiMeet:不幸的是他们这么说,因为标准明确指出引用不是对象。就像变量的名称一样:变量是一个对象,但它的名称不是。引用的被引用是对象,但引用本身不是对象。
史蒂夫·杰索普

能否请您告诉标准引用,该引用明确表明引用不是对象。
破坏者

1
@PravasiMeet:嗯,我认为有一个直截了当的声明,但目前我找不到,所以也许毕竟不是很明确。但是,[intro.object]表示“对象是存储区域”,[dcl.ref]在注释中表示“可以将引用视为对象的名称”,并且通常“未指定是没有参考资料需要存储”。
史蒂夫·杰索普

还请在FAQ中进行观察,首先说“什么是引用?对象的别名(别名)”。因此,如果他们说引用是名称,引用是对象,则只要他们说名称是对象,那么它们就是一致的。但是,就C ++标准的术语而言,对象的名称也不是对象。它在表达式中表示对象,该对象不同,但是在英语中“ is”可以表示任何一种。
Steve Jessop

8

我在生成LLVM代码的DSL上下文中取得了很好的效果。一个例子将说明。说xy是值(即类型的对象value)。然后,表达式x+y将ADD指令发送到某些代码流中。明智地,该表达式&x发出一条指令以获取地址x


8

四年后,另一个答案。

我看到的另一种用法是当您背负C ++语言但定义了自己的语义时。主要示例:Boost.Spirit。

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

和谓词解析器(&a)

描述

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

用法示例:

基本的预读示例:确保最后一个字符是分号,但不要使用它,只需查看下一个字符即可:

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

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


2
简而言之,表达式模板的另一个示例是相同的答案
sehe


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.