我们可以访问不存在的类类型对象的成员吗? 在C++标准中,在说:

我们可以访问不存在的类类型对象的成员吗? 在C++标准中,在说:,c++,language-lawyer,strict-aliasing,class-members,C++,Language Lawyer,Strict Aliasing,Class Members,如果程序试图通过以下类型之一以外的glvalue访问对象的存储值,则行为未定义:[……] 在其元素或非静态数据成员(递归地包括子集合或包含的联合的元素或非静态数据成员)中包含上述类型之一的聚合或联合类型[…] 这句话是严格的别名规则的一部分 它允许我们通过类成员访问别名吗 class A{ //"casted to" aggregate int i; float g; }; int j=10; int l = reinterpret_cast<A*&g

如果程序试图通过以下类型之一以外的glvalue访问对象的存储值,则行为未定义:[……]

  • 在其元素或非静态数据成员(递归地包括子集合或包含的联合的元素或非静态数据成员)中包含上述类型之一的聚合或联合类型[…]
这句话是严格的别名规则的一部分

它允许我们通过类成员访问别名吗

class A{ //"casted to" aggregate
  int i;
  float g;
  };

int j=10;
int l = reinterpret_cast<A*>(&j)->i;
A类{//“浇注到”骨料
int i;
浮球g;
};
int j=10;
int l=重新解释铸件

不规定对象表达式必须引用该类型的对象,仅规定glvalue必须具有类类型(对象表达式是点“”左侧的表达式)。然而,有一个词反复出现在与成员访问相关的句子中,这可能意味着我忽略了对程序的限制。例如:

如果E2是静态数据成员,E2的类型是T,那么E1.E2是左值;表达式指定类的命名成员


“指定”是否意味着该成员在其生存期内,并且我不能使用类成员访问来执行别名?或者[basic.lval]/11.6允许这样做吗?

编辑:在与比我更了解的人进行长时间交谈后,得出的结论是:这是“行为”


但谁在乎呢?不管怎样,这都是可怕的练习

对于非静态数据成员,单词是:

如果E2是非静态数据成员,并且E1的类型是“cq1 vq1 X”,并且E2的类型是“cq2 vq2 T”,则表达式指定由第一个表达式指定的对象的命名成员


显然,
*reinterpret\u cast指定的对象。

我认为您还需要分析指针的可互转换性(
&j
是指针可互转换到
A*
)。没有“联合或类”,因为联合是类。:)@格扎:恰恰相反——由于问题被标记,因此必须仔细阅读,仔细的读者会注意到,“类”包括工会,除非另有限定。我必须再仔细考虑一下,但我相信它要支持的案例就是我在该段中给出的例子。另请参见[basic.lval]/11.6是一条否定规则。“如果你做X,行为是未定义的”并不意味着“如果你不做X,行为是已定义的”。也就是说,在很多情况下,标准的某些部分会暗示某些操作的行为,而没有其他部分表示重叠的操作类会调用UB。过渡地应用
&structPtr->firstMember
(*firstMemberType)structPtr
,以及
*&intLvalue
intLvalue
的等价性足以暗示
((structType*)&intObject)->firstMember
应该如何工作,因此我不会认为这样的结构是“因遗漏而未定义的”.