如果 T1 在重新解释选角方面不比 T2 更严格,会发生什么情况?

发布于 2025-01-10 07:22:48 字数 710 浏览 0 评论 0原文

[expr.reinterpret.cast]/7: 任何对象指针类型 T1* 都可以 转换为另一个对象指针类型 cv T2*。这正是 相当于 static_cast(static_cast(T1_var)) (这意味着如果 T2 的对齐要求不比 T1的时候,指针的值没有改变并且转换了 返回到其原始类型的结果指针产生原始值)

我想知道使用reinterpret_cast将指针从一种类型转换为另一种类型时没有限制吗 在阅读给定的引用时,我唯一注意到的是目标类型应比原始类型更严格,[否则]此引用中未提及。例如

int *p = 0;
double *q = reinterpret_cast<double *>(p)

,这里 alignof(int) 不大于(更严格?)等于 alignof(double)。虽然编译器没有给出错误甚至警告,但我认为在这种情况下,q指针持有一个未指定的值?取消引用它是未定义的行为。

那么这是否意味着将 T1* 类型的指针转​​换为 T2*,只要 static_assert(alignof(T1) > ;=alignof(T2)) 失败?

[expr.reinterpret.cast]/7:
Any object pointer type T1* can be
converted to another object pointer type cv T2*. This is exactly
equivalent to static_cast<cv T2*>(static_cast<cv void*>(T1_var))
(which implies that if T2's alignment requirement is not stricter than
T1's, the value of the pointer does not change and conversion of the
resulting pointer back to its original type yields the original value)

Am I wondering that there's no limitation while casting a pointer from one type to another using reinterpret_cast. The only thing I notice, when reading the given quote, is that the target type shall be stricter than the original type, [otherwise] not mentioned in this quote. For example

int *p = 0;
double *q = reinterpret_cast<double *>(p)

Here alignof(int) is not greater (stricter?) than or equal alignof(double). Although the compiler gives no errors or even warnings, I think in this case, q pointer holds an unspecified value? and dereferencing it is undefined behavior.

So does this mean converting a pointer of type T1* into T2*, the resulting pointer always has an unspecified value as long as static_assert(alignof(T1) >= alignof(T2)) fails?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

最佳男配角 2025-01-17 07:22:48

这是否意味着将 T1* 类型的指针转​​换为 T2*(即
只要结果指针始终具有未指定的值
static_assert(alignof(T1) >=alignof(T2)) 失败?

不是真的。如果 T1 类型的实际地址不满足 的对齐要求,结果只是(但总是)未指定T2 类型。它可能会这样做,在这种情况下,行为是明确定义的。

您引用的标准中的段落指出了一个reinterpret_cast操作与两个static_cast操作的等价性通过中间void* 指针。并且,根据标准,在上一节有关 static_cast 的内容中(粗体是为了强调我的意思):

8.5.1.9 静态转换     [expr.static.cast]

13    类型为“指向cv1的指针”的纯右值
void”可以转换为“指向cv2 T”类型的纯右值,
其中 T 是对象类型,cv2 与以下相同的 cv 限定:
或比cv1更高的简历资格。如果原始指针值
表示内存中一个字节的地址A并且A不满足
T 的对齐要求,则结果指针值为
未指定
。否则,如果原始指针值指向
对象a,并且有一个类型为T的对象b(忽略
cv-qualification) 与 a 是指针可相互转换的 (6.7.2)
结果是指向 b 的指针。否则,指针值不会改变
转换。

So does this mean converting a pointer of type T1* into T2*, the
resulting pointer always has an unspecified value as long as
static_assert(alignof(T1) >= alignof(T2)) fails?

Not really. The result is only (but always) unspecified if the actual address of the T1 type doesn't fulfil the alignment requirements of the T2 type. It may do so, in which case the behaviour is well-defined.

The paragraph from the Standard you cite states the equivalence of a reinterpret_cast operation to two static_cast operations via an intermediate void* pointer. And, from the Standard, in the previous section about static_cast (bolding for emphasis mine):

8.5.1.9 Static cast     [expr.static.cast]

13     A prvalue of type “pointer to cv1
void” can be converted to a prvalue of type “pointer to cv2 T”,
where T is an object type and cv2 is the same cv-qualification as,
or greater cv-qualification than, cv1. If the original pointer value
represents the address A of a byte in memory and A does not satisfy
the alignment requirement of T, then the resulting pointer value is
unspecified
. Otherwise, if the original pointer value points to an
object a, and there is an object b of type T (ignoring
cv-qualification) that is pointer-interconvertible (6.7.2) with a, the
result is a pointer to b. Otherwise, the pointer value is unchanged by
the conversion.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文