存在哪些正当理由使一元运算符过载&?
What legitimate reasons exist to overload the unary operator&?
好吧,我受到启发做了一些头部拳击。似乎operator&
过载会导致不小的疼痛。
有什么正当理由使它超载?
(不能说我做过…)
我似乎记得一个智能指针类,它覆盖了operator&
,因为它想返回包含指针的地址,而不是智能指针对象的地址。不记得我在哪里看到的,也不记得当时这是否是个好主意。
啊哈,记住了:微软的CComPtr。
编辑:为了概括,它在以下条件下可能是有意义的:
- 你有一个伪装成其他物体的物体
- 这个对象可以获得一个指向它伪装成的东西的指针
返回合法指针以外的任何东西都会违反最小惊讶原则。
当用lambda占位符表示法表示&
操作时,它很有用,例如&_1[_2]
。
重载一元&
会使对象表现得像引用(在这方面)。
我敢肯定,尝试提供内置引用的替代方案是愚蠢的,特别是因为引用在C++中根本不是对象,而且它们没有自己的地址。用户定义类型的实例不可避免地是对象,并且确实有地址,即使您禁用了获取该地址的正常方式。因此,它从来都不是一个完美的模仿。
但是,人们非常热衷于用户定义的指针替代方案,所以我可以看出有人可能想如何尝试。我不确定他们是否会避免创建一种类型,这种类型的(错误)行为会让用户希望他们没有打扰。
我在生成LLVM代码的DSL上下文中做了这件事,效果很好。举例说明。假设x
和y
是值(即value
类型的对象)。然后表达式x+y
将ADD指令发送到某个代码流中。非常明智的是,表达式&x
发出一条取x
地址的指令。
四年后,又是一个答案。
我看到的另一个用法是,当您继承C++语言,但定义自己的语义时。主要示例:BoostSpirit.
Spirit,特别是用于解析的Qi,在解析器上重载运算符,以提供类似EBNF的语法来指定任意解析器对象。特别是,一元&
运算符被重载以提供And谓词解析器。
和谓词分析器(&a)
说明
语法谓词断言在评估另一个产品之前要满足的某个条件语法。与语义谓词eps类似,句法谓词不消耗任何输入。这个和谓词,&a、 是一个正句法谓词,返回只有当其谓词匹配时,零长度才匹配。
示例用法:
基本的前瞻性示例:确保最后一个字符是分号,但不要使用它,只需查看下一个字符:
test_phrase_parser("Hello ;", lit("Hello") >> &lit(';'), false);
简而言之,这里的一元&
与指针根本没有关系;它具有适用于Qi解析器对象的领域特定语义。
我曾经覆盖运算符&(在不改变其行为的情况下)作为类的私有,以防止偶尔创建指向堆栈中创建的对象的智能指针。仍然不确定这是否真的是个好主意。。。
- 一元*运算符的操作数是否期望一个 prvalue
- 一元"运算符"未在C++中定义
- 应用于无符号类型的一元减号运算符
- C2675 一元运算符由错误的作用域引起
- 你能帮我了解重载一元运算符和二进制运算符之间的区别吗?
- 泛型lambda和一元+运算符
- 为什么'auto'不尊重一元减号运算符?
- 在C++中,一元减号运算符如何处理整数文本
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 为什么我不能定义一元运算符,然后在 MSVC 的模板类中声明具有相同名称的友元二进制运算符?
- C++一元右折与一元左折,带逗号运算符
- 为什么一元运算符和不需要完整类型?
- 在三元字符串中处理一元NOT运算符的调车场算法
- 相对于一元算术运算符+,C和C++之间存在差异的原因是什么
- 错误 一元减号运算符应用于无符号类型会导致无符号
- 一元减去运算符过载C++分段错误
- MSVS 2015 显式错误 C4146 - 应用于无符号类型的一元减号运算符
- 如何在C++中重载一元和二进制减号运算符
- 重载的"运算符+"必须是一元或二进制运算符错误
- 为什么一元后运算符在 C++ 和 Java 中的行为不同