gpt4 book ai didi

c++ - 别名规则是对称的吗?

转载 作者:太空宇宙 更新时间:2023-11-04 02:17:51 25 4
gpt4 key购买 nike

我在 IRC 上与某人进行了讨论,出现了这个问题。标准允许我们通过 char 左值更改 int 类型的对象。

int a;
char *b = (char*) &a;
*b = 0;

如果我们知道对齐很好,是否允许我们在相反的方向上这样做?

我看到的问题是,如果将别名规则视为非对称关系,则别名规则不涵盖以下简单情况

int a;
a = 0;

原因是,每个对象都包含一系列 sizeof(obj) unsigned char 对象(称为“对象表示”)。如果我们更改 int,我们将更改部分或全部这些对象。然而,别名规则仅规定我们可以通过 charunsigned char 更改 int,但不能反过来。另一个例子

int a[1];
int *ra = a;
*ra = 0;

3.10/15(“包含...的聚合或 union 类型”)只描述了一个方向,但这次我们需要相反的方向(“作为元素或非静态数据成员的类型聚合类型...").

是否暗示了另一个方向?这个问题也适用于 C。

最佳答案

别名规则只是声明对于内存中的任何给定对象都有一个“有效类型”(C99 6.5.7,加上脚注 73),并且对此类对象的任何访问都会通过以下之一:

  • 与有效类型兼容的类型(constrestrict 等限定符,以及有符号/无符号性可能会有所不同)
  • 包含一种此类类型的结构或 union
  • 一个字符类型

有效类型当然没有在高级中指定——它只是一个用于指定别名的构造。但其目的很简单,即您不会使用两种不同的非字符 类型访问同一个对象。

所以答案是,是的,你确实可以往另一个方向走。

关于c++ - 别名规则是对称的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4759236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com