在 lambda 占位符表示法中,当表示 &
操作时很有用,例如: &_1[_2]
。
重载一元运算符&
可以使你的对象表现得像一个引用(在这方面)。
我相信尝试提供内置引用的替代方案是徒劳无功的,特别是因为在C++中,引用根本不是对象,它们没有自己的地址。而你定义的类型的实例不可避免地是对象,并且即使你禁用了获取该地址的常规方式,它们也有地址。因此,它永远不会完美地模拟引用。
但是,人们非常热衷于使用用户定义的指针替代方法,所以我能够理解某些人可能想要尝试。我不确定他们是否能避免创建一种(误)行为方式会让其用户后悔的类型。
四年后,又有了一个答案。
另一个用途是当您在借鉴C++语言时,但定义自己的语义。最典型的例子: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);
&
与指针没有任何关系;它具有特定领域的语义,适用于 Qi 解析器对象。我在生成LLVM代码的DSL上做到了很好的效果。以下示例说明。假设x
和y
是值(即类型为value
的对象)。那么表达式x+y
会向某个代码流中发出ADD指令。相当合理的是,表达式&x
会发出一条指令来获取x
的地址。
曾经我曾将运算符&(不改变其行为)作为类的私有成员进行重载,以保护免受在堆栈中创建智能指针对象的意外情况。但我仍然不确定这是否是一个好主意...
operator&
返回的指针类型为“T **”,并指向所包含的指针。 - user743382