1
7
对,这是个问题。指针强制转换本身定义了行为,使用它访问类型为的不存在的对象
与C不同,C++不允许即兴创作对象。
*
. 不能简单地将某个内存位置指定为类型
既然你没有做这些事情,就不会创建任何对象。
此外,C++不隐含地考虑指向相同对象的不同对象的指针。你的
当您修改代码以使用布局时
* |
2
6
别名是两个引用同一对象时出现的情况。可能是引用或指针。
如果指针是不相关的类型,编译器就没有理由期望它们指向同一个地址。这是最简单的UB:
简单地说,严格的别名意味着编译器希望不相关类型的名称引用不同类型的对象,从而位于不同的存储单元中。因为用于访问这些存储单元的地址事实上是相同的,所以访问存储值的结果是未定义的,通常取决于优化标志。
严格的别名适用于工会成员,这是单独描述的,但原因是相同的:给工会的一个成员写信并不能保证其他成员的值发生变化。这不适用于存储在union中的struct开头的共享字段。因此,禁止联合使用类型双关语。(由于历史原因和维护遗留代码的便利性,大多数编译器都不尊重这一点。) 自2017标准起: 6.10左值和右值
在7.5中
结果是:虽然可以重新解释将指针转换为不同的、不相关的和不相似的类型,但不能使用该指针访问存储值:
Reinterpret cast也不会创建它们指向的对象,并且将值赋给不存在的对象是UB,因此,如果cast指向的类不是微不足道的,也不能使用取消引用的结果来存储数据。 |
3
2
简短回答:
“直接”
在C++ 17之前,我将使用
|
Lingxi · 是否仅当指针作为参数传递给函数时才存在类型别名问题? 9 年前 |