[C++0x] code that used to be accepted isn't accepted anymore (related to constexpr changes?)
Jason Merrill
jason@redhat.com
Sun Nov 7 13:10:00 GMT 2010
On 11/07/2010 05:29 AM, Benoit Jacob wrote:
> This code:
>
>>>>> static const unsigned x = (unsigned)-1;
>>>>>
>>>>> enum e {
>>>>> ey = (int)x
>>>>> };
>
> relies on the constant global variable x being a true compile-time
> constant, right?
> But as far as I can see, it is impossible to guarantee that it
> actually is, since in theory you could do
>
> const_cast<int*>(&x) = 0;
The standard says,
Except that any class member declared mutable (7.1.1) can be modified,
any attempt to modify a const object during its lifetime (3.8) results
in undefined behavior.
So the above assignment has undefined behavior, which means the compiler
is allowed to assume that it doesn't happen.
> I guess that the only way is to say that the compiler remembers the
> initializer value -1 for x and uses it instead of x itself. In other
> words x itself is never used.
Right.
> I guess that this is where the "static"
> matters here since inside of one translation unit the initializer
> value -1 can be remembered?
'static' doesn't matter, just that it's const, integral, and initialized
with a constant expression.
Jason
More information about the Gcc-help
mailing list