为什么允许 reinterpret_cast 整型、枚举和成员指针类型指向它们自己?

Why is it allowed to reinterpret_cast integral, enumeration and pointer-to-member types to themselves?

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

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

1 [...] Conversions that can be performed explicitly using reinterpret_­cast are listed below. No other conversion can be performed explicitly using reinterpret_­cast.

2 [...] An expression of integral, enumeration, pointer, or pointer-to-member type can be explicitly converted to its own type; such a cast yields the value of its operand.

所以 reinterpret_cast<int>(42) 是允许的,而与 struct A{} 相同的转换是不允许的。为什么?

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

The note in 8.2.10 [expr.reinterpret.cast] paragraph 2 says,

Subject to the restrictions in this section, an expression may be cast to its own type using a reinterpret_cast operator.

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

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