2014-02-22 32 views
6

我正在写一门课,假设Are enumeration types layout compatible with their underlying type?的答案为“是”,但版式兼容struct kevent,但使用enum classES为filter,flags等与相关字段的适当底层类型。它也是标准布局(所有字段都是private,它们都是标准布局,没有virtual成员,没有基类)。从我读到的n3690中,我可以确定我的班级和struct kevent具有相同的值表示形式,但是我看不到标准中的任何内容,因此我可以在它们之间使用reinterpret_cast,尽管这似乎是对“价值”的合理解释表示”。标准在技术上允许吗?如果不是,知道某种类型的价值表示会给你什么?我可以在布局兼容的标准布局类型之间合法reinterpret_cast吗?

编辑2014年2月24日16:45 EST:针对一个评论,我要澄清,我想第一类reinterpret_cast参考第二,当然你可以不直接reinterpret_cast一个非指针类型到另一个非指针类型。

+1

[class.mem]/18允许通过联合进行某些类型的双击,[class.mem]/19允许通过reinterpret_cast访问* first *数据成员。但我不确定是否还有更多。 – dyp

+1

你不能在结构类型之间“reinterpret_cast”,你是指在指向这些类型的指针之间进行转换,并通过指向另一个类型的指针读取一个指针? –

+0

如果你可以从'指向A'的'reinterpret_cast'到'指向B'的指针,你可以''把'''reinterpret_cast'从'A'重新引用到'引用B'。我会更新这个问题,明确提及'reference to'位。 –

回答

5

但我看不到标准中的任何内容,因此允许我在它们之间输入reinterpret_cast,即使这看起来像是对“价值表示”的合理解释。标准在技术上允许吗?

编号标准很清楚(请参阅[basic.lval] p10)关于哪些类型可以是别名,并且不包括与布局兼容的类型。

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

如果类型都能够复制平凡和具有相同的值表示,那么你可以从一个类型的对象memcpy的于其他类型的对象,反之亦然。如果它们不是可以复制的,那么它根本就不会给你太多。

AFAICT标准实际上并没有说什么可以和不可以用布局兼容类型来完成。