ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – `reinterpret_cast`是`T *`到’T(*)[N]`是不确定的行为?

2019-10-04 08:14:59  阅读:302  来源: 互联网

标签:reinterpret-cast strict-aliasing c language-lawyer c17


请考虑以下情形:

std::array<int, 8> a;
auto p = reinterpret_cast<int(*)[8]>(a.data());
(*p)[0] = 42;

这是未定义的行为吗?我觉得是这样的.

> a.data()返回一个int *,它与int(*)[8]不同
> cppreference上的type aliasing rules似乎表明reinterpret_cast无效
>作为程序员,我知道a.data()指向的内存位置是一个包含8个int对象的数组

是否有任何我失踪的规则使这个reinterpret_cast有效?

解决方法:

数组对象及其第一个元素不是指针可互换的*,因此reinterpret_cast的结果是“指向8 int数组的指针”类型的指针,其值为“指向[0]”的指针.换句话说,尽管类型,它实际上并没有指向任何数组对象.

然后代码将数组到指针的转换应用于取消引用这样的指针(作为索引表达式(* p)[0]的一部分)2的左值.仅当左值实际引用数组对象3时才指定该转换的行为.由于此情况下的左值没有,因此omission4的行为未定义.

*如果问题是“为什么数组对象及其第一个元素不是指针可互换的?”,那么它已经被问到:Pointer interconvertibility vs having the same address.

1见[expr.reinterpret.cast]/7,[conv.ptr]/2,[expr.static.cast]/13[basic.compound]/4.

2见[basic.lval]/6,[expr.sub][expr.add].

3[conv.array]:“结果是指向数组第一个元素的指针.”

4[defns.undefined]:未定义的行为是“本文档不强制要求的行为”,包括“当本文档省略任何明确的行为定义时”.

标签:reinterpret-cast,strict-aliasing,c,language-lawyer,c17
来源: https://codeday.me/bug/20191004/1852476.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有