[...]
I wouldn't like to swear to this (perhaps someone can
clarify), but I *think* it's the case that the standard
doesn't actually say "X should compile, Y shouldn't"; rather,
it mandates cases in which compilers are required to issue
a diagnostic (that doesn't necessarily mean they have to fail
to compile your code, as I understand it). In this case,
presumably mismatched declaration and initializer list orders
isn't one of those cases, but g++ chooses to warn you by
default anyway.
You're basically right. According to the standard, if a program
is ill-formed, the implementation is required to issue
a diagnostic message (unless it is explicitely noted that "no
diagnostic is required" or the standard says that violations
result in "undefined behavior"). The standard doesn't say what
happens after that, and since "Undefined behavior may also be
expected when this International Standard omits the description
of any explicit definition of behavior", it's formally undefined
behavior---the compiler can do anything it wishes. (This
language dates from the C standard, and back when it was
adopted, one person suggested that a compiler could document
that it's diagnostic message was to turn the light on on the
hard disk for an unspecified length of time, and then format the
hard disk

.)
The logic behind this is to allow an implementation to "extend"
the language, making code that would otherwise contain
diagnosable errors part of the extension. All that was requires
was that it output a diagnostic (say along the lines of "This
code uses an extension"); it could then continue, doing whatever
it liked with the code. (In practice, all of the compilers I've
seen have preferred to use compiler options, so you can compile
in strictly conformant mode, and the the compiler is standard
compliant, or with extensions activated, and the compiler is not
compliant. IMHO, this is a better solution.)
Note too that there's nothing to forbid a compiler from
outputting a diagnostic for a correct program. A lot of
compilers do sort of distinguish, using the distinction error
and warning. But the distinction is rarely perfect---a lot of
compilers will only output warnings for certain types of
diagnosable errors.
One additional comment: the standard defines diagnostic message
as "a message belonging to an implementation-defined subset of
the implementation’s output messages", and
implementation-defined behavior as "behavior, for a well-formed
program construct and correct data, that depends on the
implementation and that each implementation shall document."
Note well the last five words: anything that is
implementation-defined must be documented. I would interpret
this to mean that the compiler must document which "warnings"
are due to "diagnosable errors", in the sense of the standard,
and which concern legal code. I've yet to find this
documentation for any compiler I've used, however. (G++, for
example, simply says that any messages that the compiler outputs
should be considered a diagnostic message in the sense of the
standard. Which is technically correct, since the standard
allows a diagnostic message even if there is no error, but it
certainly ignores the intent of the rules.)