Re: Anonymous union rules against constructors & assignment
Carl Barron wrote:
Greg Herlihy <greghe@pacbell.net> wrote:
And if a union is to be used, then the only approach is to eliminate
the non POD types. I would imagine that a union like the one below
could suffice:
int main()
{
union // anon_1
{
char data[4];
struct // anon_2
{
char d0;
char d1;
char d2;
char d3;
};
} x, y;
x.d1 = 23; // Works fine
x.d2 = 123; // Fine
y.d1 = 5; // Fine
y.d2 = x.d1; // Fine
x.d2 = y.d2; // Fine
}
as long as data is not used for array access of the struct. There is
no guarantee that sizeof(anon_2) == 4 or that offsetof(anon_2,d1)==1,
etc.
the only guarntess are that d0 and data[0] have the same address and
that sizeof(anon_1)>= max(4,sizeof(anon_2)). Any more assumptions is
non standard, and probably compiler option dependent as well...
With a slightly more elaborate declaration the union can guarantee that
each field in the struct (d1, d2, d3, d4) lines up exactly with the
corresponding element in the array:
#include <tr1/type_traits>
typedef std::tr1::aligned_storage<1, 1>::type Aligner;
union Element
{
Aligner u;
char c;
Element& operator=(char ch)
{
c = ch;
return *this;
}
};
union U
{
Element data[4];
struct
{
Element d1;
Element d2;
Element d3;
Element d4;
};
} x, y;
Greg
---
[ comp.std.c++ is moderated. To submit articles, try just posting with ]
[ your news-reader. If that fails, use mailto:std-c++@ncar.ucar.edu ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.comeaucomputing.com/csc/faq.html ]