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

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

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 варианта не эквивалентны?

2

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]