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

Bil*_*eal 68 c++ operator-overloading

好吧,我受到启发,做了一些冲击.似乎超载operator&导致了不小的痛苦.

重载它有哪些合法案例?

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

Mar*_*som 52

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

啊,记得:微软的CComPtr.

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

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

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

  • @curiousguy我不这么认为.包含的指针的类型为"T*".`operator&`返回的指针有类型`T**`,并指向包含的指针. (5认同)
  • CComPtr中的操作员和过载是一种危险的黑客行为.仅当智能指针尚未初始化时才有效.否则,它已经拥有的对象将不会使其引用计数递减,并且泄漏很多.在调试版本中,它实际上断言指针已经为空,因为这种错误太常见了. (2认同)

Ste*_*sop 10

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

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

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


Meh*_*dad 10

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


Ant*_*ony 8

四年后,另一个答案.

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

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

And-Predicate Parser(&a)

描述

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

用法示例:

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

test_phrase_parser("Hello ;", lit("Hello") >> &lit(';'), false);
Run Code Online (Sandbox Code Playgroud)

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

  • 简而言之,它与表达模板的另一个例子是相同的答案 (2认同)

And*_*ost 7

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