此代码中是否违反了严格别名规则?我以为
int
-> char
和 int
-> std::byte
都可以,但是 int8_t
呢?
int main() {
int arr[8] = {1, 1, 1, 1, 1, 1, 1, 1}; // Little endian: 10000000 | 10000000 ....
int8_t *ptr = (int8_t*)arr; // Do we have a violation of the Strict Aliasing rule in this cast?
ptr += 3; // 100[0]0000 ....
cout << (int)*ptr << endl; // outputs 0
return 1;
}
int8_t *ptr = (int8_t*)arr;
这非常好,相当于
reinterpret_cast
。
强制转换本身从来都不是严格的别名违规;所指向对象的访问权限是。请参阅什么是严格的别名规则?了解更多详细信息。
ptr += 3;
这是未定义的行为:
对于加法或减法,如果表达式 P 或 Q 具有“指向 cv T 的指针”类型,其中 T 和数组元素类型不相似,则行为未定义。 [示例1:
int arr[5] = {1, 2, 3, 4, 5}; unsigned int *p = reinterpret_cast<unsigned int*>(arr + 1); unsigned int k = *p; // OK, value of k is 2 ([conv.lval]) unsigned int *q = p + 1; // undefined behavior: p points to an int, not an > unsigned int object
—结束示例]
您所做的实际上是相同的,只是用
int8_t
而不是 unsigned int
。