这怎么可能解决严格别名合规问题?

时间:2014-08-14 09:39:10

标签: c++ strict-aliasing type-punning

以下程序生成编译错误

error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]

(gcc 4.7.3 with -std = c ++ 0x -O3 -Wall -Werror)

#include <cstring>
#include <iostream>

struct S
{
    int t;
};


int main3()
{
    char data[100];
    std::memset(data, 0, 100);


    int offset = 15;


    // variant #1
    const S& s = *reinterpret_cast<const S*>(&data[offset]);

    // variant #2
    //const S* sPtr = reinterpret_cast<const S*>(&data[offset]);
    //const S& s = *sPtr;

    std::cout << s.t;




    return 0;
}

然而,可以通过取消注释变量#2来修复它,它只使用中间指针变量,而不是直接解除引用。

为什么?两种变体不相同吗?

0 个答案:

没有答案