> > I'll take another attempt at declaring gcc behaviour to be correct.
> > According to 4.10/1, "success" is a null pointer constant:
> > 
> > # A null pointer constant is an integral constant expression (5.19)
> > # rvalue of integer type that evaluates to zero. A null pointer
> > # constant can be converted to a pointer type; the result is the null
> > # pointer value of that type and is distinguishable from every other
> > # value of pointer to object or pointer to function type.
> > 
> > 5.19/1 defines "integral constant expressions":
> > 
> > # An integral constant-expression can involve only literals (2.13),
> > # enumerators, const variables or static data members of integral or
> > # enumeration types initialized with constant expressions (8.5),
> > # non-type template parameters of integral or enumeration types, and
> > # sizeof expressions.
> 
> Then why does the following NOT compile:
> 
> void stat ();
> enum {success};
> void monk ()
> {
>   if (stat == success);
> }
> 
> cbool.cpp:6: no match for `void (&)() == <anonymous enum>' operator
> 
> As success is an enumerator which is a integral constant-expression by your
> definition above; it also has zero value and thus must be a "null pointer
> constant" and hence the comparisom should be allowed (however distasteful
> that may be).

In this code, "success" does not have integer type. 3.9.1/7 specifies

# Types bool, char, wchar_t, and the signed and unsigned integer types
# are collectively called integral types. A synonym for integral type
# is integer type.

Since a null pointer constant must be of integer type, "success" does
not qualify. Change it to "(int)success", and it compiles.

Regards,
Martin


Reply via email to