C++ 在基元类型指针之间强制转换

C++ 在基元类型指针之间强制转换,c++,language-lawyer,strict-aliasing,C++,Language Lawyer,Strict Aliasing,是否定义了以下各项: char* charPtr = new char[42]; int* intPtr = (int*)charPtr; charPtr++; intPtr = (int*) charPtr; intPtr未正确对齐(两种情况中至少有一种)。仅仅在那里拥有它是违法的吗?它在任何阶段都在使用它吗?你怎么能使用它?你怎么不能?通常,如果int的对齐要求大于char的对齐要求,则结果是未指定的(5.2.10p7)。结果将是int*类型的有效值,因此可以首先使用运算符将其打印为指针

是否定义了以下各项:

char* charPtr = new char[42];
int* intPtr = (int*)charPtr;

charPtr++;
intPtr = (int*) charPtr;

intPtr
未正确对齐(两种情况中至少有一种)。仅仅在那里拥有它是违法的吗?它在任何阶段都在使用它吗?你怎么能使用它?你怎么不能?

通常,如果
int
的对齐要求大于
char
的对齐要求,则结果是未指定的(5.2.10p7)。结果将是
int*
类型的有效值,因此可以首先使用
运算符将其打印为指针,当然:指针保证在
第一种情况(根据§5.3.4/10和§3.7.4.1/2),可能正确
在这两种情况下保持一致。(显然,如果
sizeof(int)==1,但是
即使不是这样,实现也不会
必须有对齐要求。)

为了让事情更清楚:你的演员阵容都是
重新诠释的

除此之外,这是一个有趣的问题,因为 据我所知,这两个角色没有什么不同 有关标准。转换结果如下所示 未指定(根据§5.2.10/7);你甚至不能保证 将其转换回
char*
将导致 原值。(例如,在机器上显然不会 其中
int*
小于
char*

当然,在实践中:标准要求返回
新字符[N]
的值应与任何值充分对齐 这可能适合它,因此保证您能够:

intPtr = new (charPtr) int;
考虑到
int
的默认构造函数是no-op。(假设
如果在此之后尝试使用
intPtr
,则会发生(在相关处理器上)未对齐的访问。因此,这绝对是不可接受的。虽然它可能在某些处理器上工作-例如,x86如果稍微慢一点,将很高兴读取未对齐的内存。我认为您可以回退,但在回退后无法使用:)不过我得检查一下。你说“你能把它放回去吗?”是什么意思?@JohnDibling删除了那个部分(发现放回去是必须的)。在
C++
中,最好使用
static\u cast
而不是
C
样式的铸造。原来的
char*
新char[42]
的结果。