取地址运算符&是否有可能返回nullptr?
取地址运算符&是否有可能返回nullptr?
这问题看着好像有点“常识级”,但其实问到了标准规范的细节上——毕竟日常写代码用&的时候,从来没碰到过返回空指针的情况,但到底C++标准有没有拍胸脯保证绝对不会呢?我来掰扯清楚:
首先说最核心的情况:原生内置的取地址运算符,作用于合法存在的对象时,标准明确要求不能返回nullptr。
只要是一个真正存在、处于有效生命周期内的对象(比如你在栈/堆上正常声明的变量、全局对象这些),它必然占据内存中的一块合法区域,&运算符必须返回指向这块区域的有效指针,不可能是空。比如int x = 10; auto p = &x;,p绝对是一个非空的有效指针,这是标准硬性规定的。
然后得提几个容易混淆的特殊情况:
- 对非法对象操作属于未定义行为:如果你尝试对已经被销毁的对象(比如栈变量出了作用域后)、或者压根不存在的“对象”(比如对
nullptr取地址?不对,&nullptr本身就是非法的,编译器会直接报错)取地址,这属于未定义行为——标准不保证任何结果,有可能得到的指针巧合等于nullptr,但这不是&运算符的正常行为,而是你触发了UB(未定义行为),任何情况都可能发生,不能算“&返回nullptr”的合法场景。 - 类重载了
operator&的情况:C++标准允许类自定义重载取地址运算符,这时候你完全可以让它返回nullptr,比如:
class TrickyClass { public: void* operator&() const { return nullptr; } };
这时候声明TrickyClass obj;,然后&obj就会返回nullptr——但这是用户自定义的行为,不是原生&运算符的行为,本质上是调用了一个类的成员函数,和内置的取地址逻辑完全两码事。
最后再总结下:
- 没被重载的原生
&,对合法存在的对象操作时,标准保证返回非空的有效指针,不可能是nullptr。 - 只有类重载了
operator&并故意返回空,或者触发了未定义行为的极端场景下,才会出现“看起来&返回了nullptr”的情况,但前者是自定义行为,后者是违规操作的结果。
备注:内容来源于stack exchange,提问作者Alexey S. Larionov
相关产品推荐
相关产品推荐

