> On Tue, Oct 23, 2001 at 08:21:26PM +0200, Martin v. Loewis wrote: > > > The following code does not produce an error when one is expected. > > > void stat (); > > > > > > static const int success = 0; > > > > > > void monk () > > > { > > > if (stat == success); > > > }; > > > > Thanks for your report. This is not a bug in the compiler: both the > > function pointer and the integer convert to bool (4.12). So this is a > > boolean comparison, and thus well-formed C++. > > Really?
You are right, I was confused (I thought of the operator signatures in 13.6/12, ignoring that those aren't used if none of the arguments was of class type). 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. Since "success" is an integral constant expression of integer type, it is a null pointer constant, and can be converted to void(*)(). So this is a function pointer comparison, and thus well-formed C++ :-) Regards, Martin