std::addressof的核心功能是绕过可能被重载的一元&运算符,直接获取对象在内存中的真实起始地址。即使目标类重载了operator&使其返回非指针类型或代理对象,该函数仍能可靠返回对象的实际内存位置。以下是详细解析:
功能本质
解决重载operator&的干扰
- 普通
&运算符的局限性:若类重载了operator&(例如返回自定义代理对象、其他标量类型或抛出异常),直接使用&obj会调用用户自定义的重载版本,导致无法获取真实的内存物理地址。 std::addressof通过底层机制强制绕过用户自定义的重载逻辑,确保返回对象内存布局的第一个字节的地址,消除了来自用户侧定制行为的副作用。
与普通取址操作的关键区别
&obj:属于语言级运算符。可能调用类的重载operator&,其返回类型和语义由类定义决定(甚至可能不是指针类型)。std::addressof(obj):属于标准库级工具函数。始终返回对象的真实内存地址,其返回类型严格为T*(并完美保留原对象的const或volatile限定符)。
实现原理
基于核心类型转换的传统实现
在 C++17 之前,标准库为了在纯 C++ 语言层面规避operator&的重载干扰,通常采用多层强制类型转换的方式来实现。其典型逻辑如下:
template<classT>T*addressof(T&arg)noexcept{returnreinterpret_cast<T*>(&const_cast