【问题标题】:std::getline() returnsstd::getline() 返回
【发布时间】:2010-09-20 12:44:40
【问题描述】:

我有一个循环,它使用getline() 读取文件中的每一行:

istream is;
string line;
while (!getline(is, line).eof())
{
    // ...
}

我注意到像这样调用getline() 似乎也有效:

while (getline(is, line))

这里发生了什么? getline() 返回一个流引用。它是否以某种方式转换为指针?这实际上是一个好习惯还是我应该坚持第一种形式?

【问题讨论】:

    标签: c++ getline


    【解决方案1】:

    getline() 返回的istream 隐式调用其运算符void*() 方法,该方法返回流是否遇到错误。因此,它比调用eof() 进行更多检查。

    【讨论】:

    • Charles 是对的,你也对哨兵提供的运算符感到困惑。
    • 在我写测试时删除了我的最后一篇文章。现在我很确定它会转换为 bool。
    • 除非您的 SL 实现是非标准的,否则它会强制转换为 void*。这就是标准所要求的。
    • 我有一份标准的在线(阅读草稿)版本。你从哪里引用?看我下面的帖子。如果我们能将这一点确定为标准中的通过,我将非常高兴是正确的。
    • C++0x 保留了“operator unspecified-bool-type() const;”的确切定义。未指定(§27.4.4.3/1)。 C++98 定义了“操作符 void*() const;”。如果你仔细看,没有“operator bool()const”。您误认为“basic_istream::sentry::operator bool()const”(§27.6.1.1.3/8)
    【解决方案2】:

    更新:

    我错误地将 basic_istream documentation 指向 basic_istream::sentry 类上的 operator bool() 方法,但正如已经指出的那样,这实际上并不是正在发生的事情。我投票赞成查尔斯和卢克的正确答案。它实际上是被调用的操作符 void*()。更多关于这个in the C++ FAQ

    【讨论】:

    【解决方案3】:

    查尔斯确实给了correct answer

    调用的确实是std::basic_ios::operator void*(),而不是sentry::operator bool(),这与std::getline()返回std::basic_istream(因此是std::basic_ios)而不是哨兵这一事实一致。

    对于非信徒,请参阅:

    否则,正如其他人已经说过的那样,更喜欢规范的第二种形式。如果你真的想要一个冗长的代码,不要使用fail()——我不记得是否可以使用xxx.good()代替!xxx.fail()

    【讨论】:

    • 确实如此。 dinkumware 已删除其在线文档。链接固定。谢谢。
    【解决方案4】:

    我会坚持第一种形式。虽然第二种形式可能有效,但它几乎不明确。您的原始代码清楚地描述了正在执行的操作以及预期的行为方式。

    【讨论】:

    • 不过,流可能是坏的而不是 eof()。如果要显式,可以调用 good()。
    • 是的,你是对的。最好使用第一种形式,但调用 .good() 而不是 .eof()
    • 我个人喜欢使用隐式强制转换为 bool。看起来所有其他语言都在迭代行。
    猜你喜欢
    • 2011-10-12
    • 2011-06-10
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2011-04-02
    • 2013-12-13
    • 1970-01-01
    相关资源
    最近更新 更多