【发布时间】:2017-12-15 10:33:00
【问题描述】:
这是读取普通可复制对象字节的常用方法
Object obj;
auto p = reinterpret_cast<char*>(&obj);
for(size_t i = 0; i < sizeof(obj); i++)
consume(p[i]);
问题不在于严格的别名,char* 可以给任何东西加上别名。问题在于[expr.add]的这段话
当一个整数类型的表达式被添加到指针或从指针中减去时,结果具有指针操作数的类型。如果表达式
P指向带有n元素的数组对象x的元素x[i],则表达式P + J和J + P(其中J的值为j)指向(可能是假设的)元素x[i + j]如果0 ≤ i + j ≤ n;否则,行为未定义。同样,表达式P - J指向(可能是假设的)元素x[i − j]if0 ≤ i − j ≤ n;否则,行为未定义。
假设元素所指的地方
为此目的,通过数组
x的n元素的最后一个元素的指针被认为等效于指向假设元素x[n]的指针
也就是说,只有在指向数组的指针上进行算术运算并且结果仍在其范围内时才合法。
但是,这里显然没有char[sizeof(Object)],我们可以对该指针进行算术运算吗?
请注意,读取对象字节的合法解决方案是std::memcpy 对象。但如果那是唯一的解决方案,那么它会问,如果你几乎不能用它做任何事情,为什么还要允许char* 别名?
【问题讨论】:
-
为什么缺少元素过去是一个问题?对于指针和数组的所有用途,这肯定是真的吗?
-
unsigned char*算术,当然。char*我不认为你可以。 -
很久以前[在一个遥远的星系中]没有
void*类型,而是使用char*。 -
@OliverCharlesworth 这篇文章说你只能对数组的元素进行算术运算,最后的元素被视为假设元素。我假设这就是你要问的?
-
@Bathsheba 为什么
unsigned char*有什么不同?
标签: c++ language-lawyer