3一元 & 运算符的结果是指向其操作数的指针。操作数应为左值或限定 ID。
如果操作数是命名某个类型为 T 的 C 类的非静态或变体成员 m 的限定 ID,则结果的类型为“指向类型为 T 的 C 类成员的指针”,并且是指定 C::m 的纯右值。否则,如果表达式的类型为 T,则结果的类型为“指向 T 的指针”,并且是纯右值,它是指定对象 (4.4) 的地址或指向指定函数的指针。 [注意:特别是,“cv T”类型对象的地址是“指向 cv T 的指针”,具有相同的 cv 限定。— 结束注释] 出于指针算术 (8.7) 和比较 (8.9、8.10) 的目的,以这种方式获取地址的非数组元素的对象被视为属于具有一个类型为 T 的元素的数组。
无法保证
operator&
不会返回nullptr
,例如通过重载该运算符。以下是一个虚构的例子:
演示
OP 的问题专门针对
&x
(正如 OP 在评论中提到的)。如果运算符未重载,则对于内置类型和用户定义类型来说都不是。否则,对于用户定义类型,您可以重载运算符,然后行为将基于您的实现,您也可以返回。
&
&
operator&
nullptr
来自 C++17 (8.3.1) 一元运算符[强调我的]:
编辑:
&
以下部分是为了证明运算符的地址不能返回nullptr
用户定义类型操作数(没有重载运算符)的说法&
。以下参考来自 C++17。
来自 7.11 指针转换
来自 8.10 等式运算符
保证表达式的
obj1 == &obj2
计算结果为false
。