答案 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环境中做到了这一点。一个例子将说明。说x
和y
是值(即value
类型的对象)。然后表达式x+y
向某些代码流发出ADD指令。很明智,表达式&x
会发出一条指令来获取x
的地址。
答案 5 :(得分:-1)
曾经我曾经超越过运营商& (不改变其行为)作为类的私有,以防止偶尔创建指向堆栈中创建的对象的智能指针。还不确定这是不是真的好主意......
答案 6 :(得分:-3)
您可以重载地址运算符以使其成为私有。这对于实现某种接力棒传递方案非常有用,其中不能使用接力棒的地址。如果接力棒的构造器被隐藏,这可以使接力棒的范围保持密闭。