【问题标题】:Address of an empty base optimized subobject空基础优化子对象的地址
【发布时间】:2018-11-06 08:21:02
【问题描述】:

假设我有一个值:

int i = 0;

还有一个可以进行空基优化的空类:

struct Empty{
  // stuff that passes
  // static_assert( std::is_empty<Empty>::value );
 };

是否合法:

Empty& e = *reinterpret_cast<Empty*>(reinterpret_cast<void*>(&i)); //?
// do stuff with e

【问题讨论】:

  • Empty* 不允许别名为integer,所以我会拒绝。
  • @Swordfish int 这个问题是偶然的。可以是什么类型让Empty*可以给它起别名?
  • 如果您不想将其作为解释严格别名的帖子的副本简单地关闭,为什么不回顾一下您要完成的工作呢?这有一种XY问题的感觉。
  • @tsuki 请自己阅读:basic.lval/11
  • e 是空的,你能做什么?

标签: c++ template-meta-programming void-pointers is-empty void-safety


【解决方案1】:

根据这个online C++ standard draft,从一种指针类型转换为另一种指针类型然后返回是有条件的:

5.2.10 重新解释演员表

(7) 将“pointer to T1”类型的prvalue转换为“pointer”类型 到 T2”(其​​中 T1 和 T2 是对象类型,其中对齐 T2 的要求不比 T1 的要求更严格)并返回其 原始类型产生原始指针值。

这意味着,只要Empty 没有比int 更严格的对齐要求,从int*Empty* 的转换本身就是有效的,您可以稍后再转换回int*

但是请注意,这并不意味着您可以访问/取消引用 Empty*-object(因为它不是指针指向的 Empty-object)。

所以纯转换是可以的,但是取消引用它会产生 UB。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多