Re: Valid C++?
Alf P. Steinbach wrote:
* Tom Widmer:
Something that is 'not evaluated' is certainly never evaluated. I
agree that constant expressions do potentially need to be evaluated as
part of a sizeof in order to determine the type specified in the
sizeof. e.g.
sizeof(std::bitset<4000/2>);
4000/2 has to be evaluated. But I think constant expressions are the
special case.
(Note: the above isn't really a demonstration, because it's a type-id
argument, and the standard's comment about "evaluated" only applies to
sizeof expression argument; however, a corresponding expression arg
example is easily produced, and was shown earlier.)
Well, both evaluated and not evaluated is a contradiction.
Actually, I think I was wrong. 4000/2 isn't evaluated after all.
It seems that you resolve it by postulating a special case for constant
expressions -- but where is that special case in the standard?
Luckily, the special case is made:
3.2/2 again:
"An expression is potentially evaluated unless it appears where an
integral constant expression is required ..."
That implies that the 4000/2 isn't actually evaluated, and instead the
compiler presumably magically knows the value of it.
Finally, 5/5 says that mathematically undefined constant expressions are
actually ill-formed, not UB.
So the contradiction is cleared up I think.
I resolve it by taking "evaluated" to mean "evaluated at run-time", in
that context (context: the standard's definition of sizeof).
I think Occam's razor would agree with me.
If it were still alive & sharp. ;-)
[snip]
I think 1.9/5 makes it clear that it must be possible for the
operation to be part of a permissible execution sequence before the
program actually has UB.
The question seems to be whether there is such a thing as pure compile
time UB: something that's never actually executed, can never be
executed, and yet is clearly defined as UB by the standard?
And yes, there is.
Yes - another example is template related violations of the ODR.
So it's not the case that whatever causes UB, must be part of a
permissible execution sequence before the program actually has UB.
No, I agree with that, but I also think the standard is clear that the
various examples are not UB. If it isn't clear enough, I think a defect
report (or at least improvements for C++0x) would be good, since I think
it's certainly the intent that you don't get UB for undefined
expressions unless one of the possibly execution sequences evaluates the
undefined expression.
Tom