http://www.ufaqs.com/usenet/new/usen...t_5_of_10).htm
[15.3] How does that funky while (cin >> foo) syntax work?
See the previous FAQ[15.2] for an example of the "funky while (cin >> foo) syntax."
The expression (cin >> foo) calls the appropriate operator>> (for example, it calls the operator>> that takes an istream on the left and, if foo is of type int, an int& on the right). The istream operator>> functions return their left argument by convention, which in this case means it will return cin. Next the compiler notices that the returned istream is in a boolean context, so it converts that istream into a boolean.
To convert an istream into a boolean,
the compiler calls a member function called istream:: operator void*(). This returns a void* pointer, which is in turn converted to a boolean (NULL becomes false, any other pointer becomes true). So in this case the compiler generates a call to cin.operator void*(), just as if you had casted it explicitly such as (void*)cin.
The operator void*() cast operator returns some non-NULL pointer if the stream is in a good state, or NULL if it's in a failed state. For example, if you read one too many times (e.g., if you're already at end-of-file), or if the actual info on the input stream isn't valid for the type of foo (e.g., if foo is an int and the data is an 'x' character), the stream will go into a failed state and the cast operator will return NULL.
The reason operator>> doesn't simply return a bool (or void*) indicating whether it succeeded or failed is to support the "cascading" syntax:
cin >> foo >> bar;