towi
towi

Reputation: 22307

What implicit conversions happen with istream?

I found a piece of C-ish C++ code and asked myself the (slightly academic) question, what implicit type conversions happen here to arrive at the bool that if requires?

int val;
if( (std::cin >> val) == 0 )
    ...

I got this far:

I don't think there is a bool operator==(istream&, int) available (nor the respective member function in istream), so is there a conversion involved?


Just to be clear, the programmers intention was to check if the input was a success, i.e. should have written if(!(std::cin >> val)).

Upvotes: 5

Views: 360

Answers (2)

curiousguy
curiousguy

Reputation: 8288

I believe the code as written is ill-formed.

If you compile without optimization and output assembly you might be able to see which operator or conversion function is called here:

#include <istream>

void f(std::istream &is)
{
    is==0;
}

Upvotes: 0

Andy Prowl
Andy Prowl

Reputation: 126502

I don't think there is a bool operator==(istream&, int) available [...] so is there a conversion involved?

Indeed. There is a conversion operator to bool that returns true if no errors occurred, and false otherwise.

Per paragraph 27.5.5.4/1 of the C++11 Standard:

explicit operator bool() const;

1 Returns: !fail().

So the expression (cin >> val) gives you back a (reference to) cin, which is the left operand of ==. The right operand is 0.

Now cin can be converted to bool, and that allows the comparison with 0. In other words, your if statement is equivalent to:

if (!(std::cin >> val))
{
    // ...
}

Upvotes: 1

Related Questions