【问题标题】:Can I legally reinterpret_cast between layout-compatible standard-layout types?我可以在布局兼容的标准布局类型之间合法地 reinterpret_cast 吗?
【发布时间】:2018-04-21 12:11:21
【问题描述】:

我正在编写一个类,假设Are enumeration types layout compatible with their underlying type? 的答案是“是”,布局兼容struct kevent,但使用enum classes 表示filterflags 等相关字段的基础类型。它也是标准布局(字段都是private 并且都是标准布局,没有virtual 成员,没有基类)。从我对n3690 的阅读中,我可以确定我的班级和struct kevent 具有相同的值表示,但是我在标准中看不到任何允许我在它们之间使用reinterpret_cast 的东西,即使这看起来像对“价值表征”的合理解释。这在技术上是标准允许的吗?如果不是,知道类型的值表示会给您带来什么?

EDIT 2014/02/24 16:45 EST:作为对评论的回应,我应该澄清一下,我想 reinterpret_cast 第一个类引用 第二个,当然你不能直接reinterpret_cast一个非指针类型到另一个非指针类型。

【问题讨论】:

  • [class.mem]/18 允许通过联合进行某些类型的双关语,[class.mem]/19 允许通过 reinterpret_cast 访问 first 数据成员。但我不确定是否还有更多。
  • 你不能reinterpret_cast在结构类型之间,你的意思是在指向这些类型的指针之间转换并通过指向另一个的指针读取一个?
  • 如果您可以将reinterpret_castpointer to A 转换为pointer to B,您可以将reinterpret_castA 转换为reference to B。我将更新问题以明确提及reference to 位。

标签: c++ standards c++14 standard-layout


【解决方案1】:

但我在标准中看不到任何允许我在它们之间使用reinterpret_cast 的内容,尽管这似乎是对“价值表示”的合理解释。这在技术上是标准允许的吗?

没有。标准很清楚(参见 [basic.lval] p10)哪些类型可以别名,并且不包括布局兼容类型。

如果不是,知道类型的值表示会给你什么?

如果这些类型都可以简单地复制并且具有相同的值表示,那么您可以从一种类型的对象 memcpy 到另一种类型的对象,反之亦然。如果它们不是一般可复制的,那么它根本不会给你太多。

AFAICT 标准实际上并没有说明布局兼容类型可以做什么和不可以做什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-02
    • 2012-03-02
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    相关资源
    最近更新 更多