Re: Valid C++?
* 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.
It seems that you resolve it by postulating a special case for constant
expressions -- but where is that special case in the standard?
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.
The first I found by simply searching for "undefined" was ?2.1/1/2
(sub-para of para of section): if you use a backslash line continuation
to form universal character name, "the behavior is undefined".
So it's not the case that whatever causes UB, must be part of a
permissible execution sequence before the program actually has UB.
At least as I see it. :-)
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?