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

Ste*_*mit 33 c++ boolean ifstream

一个标准的习语是

while(std::getline(ifstream, str))
    ...
Run Code Online (Sandbox Code Playgroud)

所以如果这有效的话,我为什么不能说

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

    std::ifstream infile(filename);

    ...

    return std::getline(infile, val);
}
Run Code Online (Sandbox Code Playgroud)

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

值函数return中语句的布尔bool上下文是否与 的布尔上下文有所不同while(),以至于在一个上下文中执行的魔术转换std::basic_istream在另一个上下文中不起作用?


附录:这里显然有一些版本,也许还有语言标准依赖性。我在 g++ 8.3.0 中遇到了上述错误。但我在 gcc 4.6.3 或 LLVM (clang) 9.0.0 中没有得到它。

Fat*_*KIR 49

的布尔转换运算符std::basic_istreamexplicit这意味着该类型的实例不会隐式变为 a,bool而是可以显式转换为 a,例如通过键入bool(infile)

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

但是,return 语句不会考虑explicit转换运算符或构造函数。因此,您必须将其显式转换为 a 的布尔值return

  • 所以“显式”转换有时不是 (19认同)
  • @MM “* ! 的操作数算作到 bool* 的“显式”转换” - 除了这种情况,因为 `istream` 有一个 [`operator!`](https://en.cppreference.com/w/cpp/ io/basic_ios/operator!) 已实施。 (6认同)
  • '当初始化 T2 类型的新对象时,包括返回 T2 的函数中的 return 语句;' - 这是在文档中,为什么它不适用于此处? (3认同)
  • 谢谢。`explicit` 是那些收益递减的细微差别之一,我可怜的老大脑认为它不够重要,值得学习,但是在我的 `std::getline()` 调用周围使用 `bool(...)` 似乎有效。 (2认同)
  • 没关系,只需点击您的链接即可进行上下文转换。我发现的东西似乎说明了隐式转换发生的地方,而不是显式转换不能发生的地方。您的其他链接阐明了其中的区别。好答案。 (2认同)