Следующая программа генерирует ошибку компиляции
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 варианта не эквивалентны?
Задача ещё не решена.