Home > database >  Why can't I return std::getline's as-if-boolean result?
Why can't I return std::getline's as-if-boolean result?

Time:03-15

A standard idiom is

while(std::getline(ifstream, str))
    ...

So if that works, why can't I say

bool getval(std::string &val)
{
    ...

    std::ifstream infile(filename);

    ...

    return std::getline(infile, val);
}

g says "cannot convert 'std::basic_istream<char>' to 'bool' in return".

Is the Boolean context of a return statement in a bool-valued function somehow different from the Boolean context of while(), such that the magic conversion that std::basic_istream performs in one context doesn't work in the other?


Addendum: There's apparently some version and perhaps language standard dependency here. I got the aforementioned error with g 8.3.0. But I don't get it with gcc 4.6.3, or LLVM (clang) 9.0.0.

CodePudding user response:

The boolean conversion operator for std::basic_istream is explicit. This means that instances of the type will not implicitly become a bool but can be converted to one explicitly, for instance by typing bool(infile).

Explicit boolean conversion operators are considered for conditional statements, i.e. the expression parts of if, while etc. More info about contextual conversions here.

However, a return statement will not consider the explicit conversion operators or constructors. So you have to explicitly convert that to a boolean for a return.

  • Related