aliasing estricto y alineación

Necesito una forma segura de alias entre tipos de POD arbitrarios, conforme a ISO-C ++ 11 considerando explícitamente 3.10 / 10 y 3.11 de n3242 o posterior. Aquí hay muchas preguntas sobre alias estricto, la mayoría de ellas con respecto a C y no a C ++. Encontré una "solución" para C que usa uniones, probablemente usando esta sección

tipo de unión que incluye uno de los tipos antes mencionados entre sus elementos o miembros de datos no estáticos

Desde que construí esto.

#include <iostream>

template <typename T, typename U>
T& access_as(U* p)
{
    union dummy_union
    {
        U dummy;
        T destination;
    };

    dummy_union* u = (dummy_union*)p;

    return u->destination;
}

struct test
{
    short s;
    int i;
};

int main()
{
    int buf[2];

    static_assert(sizeof(buf) >= sizeof(double), "");
    static_assert(sizeof(buf) >= sizeof(test), "");

    access_as<double>(buf) = 42.1337;
    std::cout << access_as<double>(buf) << '\n';

    access_as<test>(buf).s = 42;
    access_as<test>(buf).i = 1234;

    std::cout << access_as<test>(buf).s << '\n';
    std::cout << access_as<test>(buf).i << '\n';
}

Mi pregunta es, solo para estar seguro, ¿es este programa legal de acuerdo con el estándar?*

No da ninguna advertencia y funciona bien cuando se compila con MinGW / GCC 4.6.2 usando:

g++ -std=c++0x -Wall -Wextra -O3 -fstrict-aliasing -o alias.exe alias.cpp

* Editar: Y si no, ¿cómo podría uno modificar esto para que sea legal?

Respuestas a la pregunta(8)

Su respuesta a la pregunta