Мне нужен безопасный способ псевдонимов между произвольными типами POD, соответствующими ISO-С++ 11, явно рассматривающим 3.10/10 и 3.11 из n3242 или более поздних версий. Здесь много вопросов о строгом псевдониме, большинство из которых касается C, а не С++. Я нашел "решение" для C, которое использует союзы, возможно, используя этот раздел
тип объединения, который включает один из вышеупомянутых типов среди его элементы или нестатические элементы данных
Из этого я построил это.
#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';
}
Мой вопрос в том, что, конечно, эта программа легальна в соответствии со стандартом? *
Он не дает никаких предупреждений и отлично работает при компиляции с MinGW/GCC 4.6.2, используя:
g++ -std=c++0x -Wall -Wextra -O3 -fstrict-aliasing -o alias.exe alias.cpp
* Edit: И если нет, как можно изменить это, чтобы быть законным?