【发布时间】:2011-09-23 16:04:51
【问题描述】:
好的,我一直是inspired to do some head punching。似乎超载operator& 会导致不小的痛苦。
存在哪些合理的超载情况?
(不能说我曾经这样做过......)
【问题讨论】:
好的,我一直是inspired to do some head punching。似乎超载operator& 会导致不小的痛苦。
存在哪些合理的超载情况?
(不能说我曾经这样做过......)
【问题讨论】:
我似乎记得类似智能指针类的东西,它覆盖了operator&,因为它想要返回包含指针的地址而不是智能指针对象的地址。不记得我在哪里看到的,也不记得当时它是否是个好主意。
啊哈,记住了:微软的CComPtr。
编辑:概括地说,它可能在以下条件下有意义:
返回合法指针以外的任何东西都会违反principle of least astonishment。
【讨论】:
T *。 operator& 返回的指针类型为T **,并指向包含的指针。
在用 lambda 占位符表示 & 操作时很有用,例如&_1[_2].
【讨论】:
重载一元 & 使您的 object 表现得像 reference(在这方面)。
我很确定尝试提供内置引用的替代方案是愚蠢的,特别是因为引用在 C++ 中根本不是对象,而且它们没有自己的地址。您的用户定义类型的实例不可避免地是对象,并且确实具有地址,即使您禁用了获取该地址的正常方式。所以它从来都不是完美的模仿。
但是,人们非常热衷于用户定义的指针替代方案,所以我可以看到有人可能想要尝试它。我不确定他们是否会避免创建一种(错误)行为方式会使其用户希望他们没有打扰的类型。
【讨论】:
我已经在生成 LLVM 代码的 DSL 上下文中做到了这一点,效果很好。将举例说明。假设x 和y 是值(即value 类型的对象)。然后表达式x+y 将 ADD 指令发送到某个代码流中。很明显,表达式&x 发出一条指令来获取x 的地址。
【讨论】:
四年后,另一个答案。
我看到的另一个用途是当您捎带 C++ 语言,但定义自己的语义时。主要示例:Boost.Spirit。
Boost.Spirit,尤其是用于解析的 Qi,重载解析器上的运算符,以提供类似 EBNF 的语法来指定任意解析器对象。特别是,一元 & 运算符被重载以提供 And-Predicate Parser。
与谓词解析器 (&a)
说明
句法谓词断言在评估另一个产生式之前要满足某个条件句法。与语义谓词 eps 类似,句法谓词不消耗任何输入。这 and-predicate, &a, 是一个肯定句法谓词,它返回一个 仅当谓词匹配时才匹配零长度。
示例用法:
基本前瞻示例:确保最后一个字符是 分号,但不要消耗它,只看下一个字符:
test_phrase_parser("Hello ;", lit("Hello") >> &lit(';'), false);
简而言之,这里的一元& 与指针完全没有关系;它具有适用于 Qi 解析器对象的领域特定语义。
【讨论】:
曾经我将运算符 & (不改变其行为)重写为类私有,以防止偶尔创建指向堆栈中创建的对象的智能指针。仍然不确定这是否真的是个好主意...
【讨论】: