On Wed, Nov 12, 2008 at 12:53:54PM +1000, Mark Tall wrote:
> Hello,
>
> I've come across an oddity in C++, involving anonymous unions and
> const variables. Neither of the two classes below will compile using
> gcc 4.3.0. Is this a bug in gcc or the C++ standard itself ?
>
> class my_class_1
> {
> union
> {
> const int x;
> const int y;
> };
>
> my_class_1() : x(0), y(0) {}
> };
The same memory is being initialized in two potentially conflicting ways.
Consider for example
class my_class_1
{
union
{
const int x;
const int y;
};
my_class_1() : x(0), y(1) {}
Here you'd be directing the compiler to store a zero and a one in
the same memory.
> class my_class_2
> {
> union
> {
> const int x;
> const int y;
> };
>
> my_class_2() : x(0) {}
> };
>
>
> compiler output:
>
> my_class.cpp: In constructor 'my_class_1::my_class_1()':
> my_class.cpp:10: error: initializations for multiple members of
> 'my_class_1::<anonymous union>'
> my_class.cpp: In constructor 'my_class_2::my_class_2()':
> my_class.cpp:22: error: uninitialized member 'my_class_2::<anonymous
> union>::y' with 'const' type 'const int'
Here you have the problem that a const member must have an initializer,
yet you cannot initialize both x and y.
I think it could be argued that unions shouldn't have const members,
and it would be a good idea for the standard to ban them.