当前位置: 首页 > 知识库问答 >
问题:

为什么我不能像返回布尔结果一样返回std::getline?

孟佑运
2023-03-14

一个标准的习语是

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

所以如果这行得通,为什么我不能说

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

    std::ifstream infile(filename);

    ...

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

g表示“无法转换”std::basic_istream

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

附录:这里显然有一些版本,也许还有语言标准的依赖性。我在G8.3.0中遇到了上述错误。但我不理解GCC4.6.3或LLVM(clang)9.0.0。


共有1个答案

桑睿识
2023-03-14

std::basic_istream的布尔转换运算符是explicit。这意味着该类型的实例不会隐式地变成bool,而是可以显式地转换为一个,例如通过键入bool(infle)

显式布尔转换运算符用于条件语句,即ifwhile等的表达式部分。有关上下文转换的详细信息,请参见此处。

然而,返回语句不会考虑显式转换运算符或构造函数。因此,您必须显式地将其转换为返回的布尔值。

 类似资料:
  • 问题内容: 为什么这些逻辑运算符返回一个对象而不是布尔值? 我想了解为什么它返回(如果已定义)OR的结果,而不返回布尔结果。 问题答案: 将返回布尔值。 更新 请注意,这是基于我的测试。我不会被完全依赖。 它是一个 不 赋值或 不 赋值的表达式。而是分配计算的值。 让我们看一下这个表达式。 表达式示例: 您的表情: 另一个表达: 另一个表达:

  • 我觉得这给了我很小的灵活性每当我使用这个函数。使用此函数时,我通常会查找元素的第一次出现,但它只返回,我发现这一点有些欠缺。 使用此函数的主要原因是每当找到元素时,都会循环,因此使用会失去作用,因为不会短路。是相同的。 我是遗漏了什么,还是必须使用循环来获取JavaScript中的第一个匹配元素?

  • 问题内容: 查看javadoc,我看到ArrayList有一个重载的add方法: public boolean add(E e) 将指定的元素追加到此列表的末尾。 和 public void add(int index,E元素) 将指定的元素插入此列表中的指定位置。将当前在该位置的元素(如果有)和任何后续元素右移(将其索引添加一个)。 我注意到第一个返回了一个,而第二个返回了一个。事实证明,第一个

  • 本文向大家介绍Math.min() < Math.max() 返回结果是什么?为什么?相关面试题,主要包含被问及Math.min() < Math.max() 返回结果是什么?为什么?时的应答技巧和注意事项,需要的朋友参考一下 返回,因为返回,返回。 猜测的实现方式大致如下: 接受不定项参数,当参数只有一个的时候,例如,那么这个需要和(js中最小的数)进行比较,所以结果返回,哪怕传入的值再小,单个

  • 这是一个布尔方法,是我作业的一小部分。我想根据输入和记录之间是否匹配来返回true或false。我想我遇到了语法问题。 这是该方法的代码,但始终有红线指示我应该在代码中添加return,否则将该方法更改为void。但我已经在if语句中添加了return true。

  • 我正在尝试使用废料并遇到一些问题。问题是我的脚本返回重复的结果。我正在尝试从父页面抓取URL,并按照每个单独的URL获取关联的日期。抓取每个嵌套的URL后,它似乎会再次从父页面输出URL列表。 下面是脚本: 下面是 json 输出: 重申一下,我很难从父页面输出一个url列表,从每个单独的嵌套URL输出一个相应的日期列表。我是scrapy和python的新手,所以希望有人能给我指出正确的方向。