Как это может исправить строгое соответствие псевдонимов?

Следующая программа генерирует ошибку компиляции

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

(gcc 4.7.3 с -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, который просто использует промежуточную переменную-указатель вместо прямой разыменования.

Как так? 2 варианта не эквивалентны?

0 ответов

Другие вопросы по тегам