我们是否违反严格别名规则?

问题描述 投票:0回答:1

此代码中是否违反了严格别名规则?我以为

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;
}
c++ strict-aliasing
1个回答
0
投票
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

—结束示例]

- [expr.add] p6

您所做的实际上是相同的,只是用

int8_t
而不是
unsigned int

© www.soinside.com 2019 - 2024. All rights reserved.