Использование преобразования указателей для сохранения / приведения значений: нарушаю ли я правило строгого алиасинга?
Вопрос относится кэта почта.
Некоторые авторитетные пользователи заявили, что следующий код нарушаетсястрогие правила алиасинга.
#include <boost/static_assert.hpp>
template <typename T>
struct MyType {
private:
T data;
public:
template <typename U>
operator U () {
BOOST_STATIC_ASSERT_MSG(sizeof(U) == sizeof(T),"Trying to convert to data type of different size");
return *((U*) &data);
}
template <typename U>
NeonVectorType<T>& operator =(const U& in) {
BOOST_STATIC_ASSERT_MSG(sizeof(U) == sizeof(T),"Trying to copy from data type of different size");
data = *((T*) &in);
return *this;
}
}
Тем не менее, я никогда не использую указатель назаписывать данные, и я никогда не разделяю указатель на них, поэтому я не могу видеть, как значение, содержащееся в переменной, может измениться без понимания компилятором, что это происходит. У меня сложилось впечатление, что, может быть, я нарушаю некоторые правила, но не строгие правила наложения ...
Примечание: я не знаю, насколько это важно, но мой компилятор (gcc 4.9) не выдает предупреждений.