Использование преобразования указателей для сохранения / приведения значений: нарушаю ли я правило строгого алиасинга?

Вопрос относится кэта почта.

Некоторые авторитетные пользователи заявили, что следующий код нарушаетсястрогие правила алиасинга.

#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) не выдает предупреждений.

Ответы на вопрос(0)

Ваш ответ на вопрос