An union with a const and a nonconst member?
This appears to be undefined behavior
union A {
int const x;
float y;
};
A a = { 0 };
a.y = 1;
The spec says
Creating a new object at the storage location that a const object with static, thread, or automatic storage duration occupies or, at the storage location that such a const object u开发者_StackOverflowsed to occupy before its lifetime ended results in undefined behavior.
But no compiler warns me while it's an easy to diagnose mistake. Am I misinterpreting the wording?
The latest C++0x draft standard is explicit about this:
In a union, at most one of the non-static data members can be active at any time, that is, the value of at most one of the non-static data members can be stored in a union at any time.
So your statement
a.y = 1;
is fine, because it changes the active member from x
to y
. If you subsequently referenced a.x
as an rvalue, the behaviour would be undefined:
cout << a.x << endl ; // Undefined!
Your quote from the spec is not relevant here, because you are not creating any new object.
It doesn't really make sense to have a const
member of a union
, and I'm surprised that the standard allows it. The purpose of all of the many limitations on what can go into a union
is to arrive at a point where bitwise assignment will be a valid assignment operator for all members, and you can't use bitwise assignment to assign to a const int
. My guess is that it's just a case that no one had previously thought of (although it affects C as well as C++, so it's been around for awhile).
If it's any consolation - the Microsoft Xbox 360 compiler (which is based on Visual Studio's compiler) does error out. Which is funny, because that's usually the most lenient of the bunch.
error C2220: warning treated as error - no 'object' file generated
warning C4510: 'A' : default constructor could not be generated
: see declaration of 'A'
warning C4610: union 'A' can never be instantiated - user defined constructor required
This error goes away if I take the const
away. gcc-based compilers don't complain.
EDIT: The Microsoft Visual C++ compiler has the same warning.
精彩评论