为什么我不能 return std::getline 的 as-if-boolean 结果?

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

一个标准的成语是

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

如果可行,为什么我不能说

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

    std::ifstream infile(filename);

    ...

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

g++ 表示“cannot convert 'std::basic_istream<char>' to 'bool' in return”。

bool 值函数中 return 语句的布尔上下文是否与 while() 的布尔上下文有某种不同,使得 std::basic_istream 在一种情况下执行在另一种情况下不起作用?


附录:这里显然存在一些版本和语言标准依赖性。我在 g++ 8.3.0 中遇到了上述错误。但是我没有使用 gcc 4.6.3 或 LLVM (clang) 9.0.0.

std::basic_istreamboolean conversion operatorexplicit。这意味着该类型的实例不会隐式成为 bool,但可以显式转换为一个,例如通过键入 bool(infile).

条件语句考虑显式布尔转换运算符,即 ifwhile 等的表达式部分。有关上下文转换的更多信息 here

但是,return 语句不会考虑 explicit 转换运算符或构造函数。所以你必须明确地将它转换为 return.

的布尔值