为什么允许 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 类型。
在 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 usingreinterpret_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 类型。