存在哪些正当理由使一元运算符过载&?

What legitimate reasons exist to overload the unary operator&?

本文关键字:运算符 一元 正当理由 存在      更新时间:2023-10-16

好吧,我受到启发做了一些头部拳击。似乎operator&过载会导致不小的疼痛。

有什么正当理由使它超载?

(不能说我做过…)

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

啊哈,记住了:微软的CComPtr。

编辑:为了概括,它在以下条件下可能是有意义的:

  • 你有一个伪装成其他物体的物体
  • 这个对象可以获得一个指向它伪装成的东西的指针

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

当用lambda占位符表示法表示&操作时,它很有用,例如&_1[_2]

重载一元&会使对象表现得像引用(在这方面)。

我敢肯定,尝试提供内置引用的替代方案是愚蠢的,特别是因为引用在C++中根本不是对象,而且它们没有自己的地址。用户定义类型的实例不可避免地是对象,并且确实有地址,即使您禁用了获取该地址的正常方式。因此,它从来都不是一个完美的模仿。

但是,人们非常热衷于用户定义的指针替代方案,所以我可以看出有人可能想如何尝试。我不确定他们是否会避免创建一种类型,这种类型的(错误)行为会让用户希望他们没有打扰。

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

四年后,又是一个答案。

我看到的另一个用法是,当您继承C++语言,但定义自己的语义时。主要示例:BoostSpirit.

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

和谓词分析器(&a)

说明

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

示例用法:

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

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

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

我曾经覆盖运算符&(在不改变其行为的情况下)作为类的私有,以防止偶尔创建指向堆栈中创建的对象的智能指针。仍然不确定这是否真的是个好主意。。。