为什么允许将整型、枚举和指向成员的指针类型reinterpret_cast到自身?



在最近的这个问题中,我们看到不允许将一些自定义类类型实例reinterpret_cast给自己;struct A{}; reinterpret_cast<A>(A{});无效(它只能通过引用或指针工作(。这似乎是有道理的,因为缺乏需要这种身份转换的真实场景。

检查相应的标准条款,我们在[expr.reinterpret.cast](强调我的(:

1 [...]下面列出了可以使用reinterpret_­cast显式执行的转换。 不能使用reinterpret_­cast显式执行其他转换。

2 [...]积分、枚举、指针或指向成员类型的表达式可以显式转换为其自己的类型;这样的强制转换产生其操作数的值。

所以reinterpret_cast<int>(42)是允许的,而带有struct A{}的相同演员则不是。为什么?

这是解析 DR 799 的一部分。问题如下:

8.2.10 [expr.reinterpret.cast] 第 2 段中的注释说:

根据本节中的限制,可以强制转换表达式 使用 reinterpret_cast 运算符转换为其自己的类型。

但是,规范性文本中没有任何内容允许这种转换,并且 第1款禁止任何未明确允许的转换。

说明中的想法被认为是值得的,即应该允许reinterpret_cast进行身份转换。所以你问的规范性文本被添加了。我可以假设对某些基本类型的限制是谨慎的第一步(甚至可能是唯一一步(。因为它没有打开与类类型关联的蠕虫罐头,并且需要调用它们的构造函数。reinterpret_cast就是不创建新对象,可以使用基本类型来做到这一点。不确定这是否适用于类类型。

最新更新