std::addressof的实现理解

std::addressof的实现

标准库中有一个std::addressof, 这个东西存在的目的是当存在operator&的重载时, 依然能够获得变量的地址. gcc(4.7.1)下的实现如下:

template<typename __Tp>
inline __Tp* __addressof(_Tp& __r) _GLIBCXX_NOEXCEPT
{
    return reinterpret_cast<__Tp*>(&const_cast<char&>(reinterpret_cast<const volatile char&>(__r)));
}

怎么理解

  1. __r的类型为__Tp
  2. __r转为const volatile char&有几个作用
    1. 防止后面用&操作符获取地址时出发原类型(即__Tp)的重载操作(operator&).
    2. reinterpret_cast操作符总是可以合法的在原类型的基础上加const或volatile, 但是如果__Tp原来带有const或volatile的话, 通过reinterpret_cast去掉是不允许的, 因此需要加上const volatile来避免编译器报错, 也就是不用在管__Tp是否是const或volatile了.
    3. 转换为char&, 因为换成其他类型有可能回触发强制地址对齐的操作, 这样的话真实地址就可能会改变, 造成Undefined Behavior.
  3. const_cast将const或volatile去掉. 因为后面我们要将获取的地址转换回__Tp*, 如果__Tp原来不包含const, 因为我们前面加了const, 非const转const是不合法的, 所以这里我们在去掉. 请和第2条对着看.
  4. 通过取地址符&获取地址后, 再通过reinterpret_cast转换回__Tp*(回保留__Tp的const或volatile如果它有这个修饰符的话)
  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值