gpt4 book ai didi

c++ - 增加已经在流末尾的 istream_iterator 的结果是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 15:28:46 25 4
gpt4 key购买 nike

我看过标准,但没有看到明显的答案。

假设我已经这样做了:

std::istream_iterator<char> is(file);
while(is != std::istream_iterator<char>()) {
++is;
}

现在is在流的末尾,等于 std::istream_iterator<char>() .如果我再增加一次会怎样?是否仍等于std::istream_iterator<char>() ?还是 os 结果未定义?

标准明确指出 *is如果 is 是未定义的行为在流的末尾。但是我还没有看到任何关于迭代超出流末尾的信息......

编辑:

我问是因为我偶然发现了一些代码,它做了这样的事情:

// skip 2 input chars
++is;
++is;
if(is != std::istream_iterator<char>()) {
// continue using is and do some work...but what if the first
// increment made it EOS? is this check valid?
}

最佳答案

C++03 中关于输入迭代器要求的表 72 说 ++r 的前提条件是 r 是可取消引用的。 r++ 的前提条件相同。

现在,24.5.1/1 说的是 istream_iterator

The result of operator* on an end of stream is not defined.

总之,operator++ 对流结束迭代器的影响是未定义的。

C++03 中关于输入迭代器要求的表 72 说 ++r 的前提条件是 r 是可取消引用的。 r++ 的前提条件相同。

现在,24.5.1/1 说的是 istream_iterator

The result of operator* on an end of stream is not defined.

总之,operator++ 对流结束迭代器的影响是未定义的。


请注意,我认为只有当您编写或使用一种算法采用表现出该行为的输入迭代器,然后传递一个 istream 迭代器时,这个结论才会使行为未定义。从仅显式使用 istream 迭代器本身,而不将其视为输入迭代器并依赖其不变量,那么我认为上面的结论不太正确(我们可能有一个类不例如,要求 r 是可取消引用的。

但看看 istream 迭代器的描述方式,在到达流值末尾后调用 operator++ 也会导致未定义的行为。 operator== 因为它被定义为等同于

x.in_stream == y.in_stream

其中 in_stream 是指向迭代流的指针 - 并暴露在标准文本中以定义行为和语义“仅展示”。现在,我能想到的唯一实现这项工作的实现是使用一个流结束迭代器,该迭代器将一个空指针存储为流指针。但是 operator++ 被定义为做一些具有以下效果的事情

*in_stream >>value

现在,如果您进入流结束状态,并且我们会将 in_stream 设置为空指针,那么肯定会产生未定义行为的效果。

因此,即使您单独使用 istream 迭代器,似乎也无法保证您可以递增超过流结束值。

关于c++ - 增加已经在流末尾的 istream_iterator 的结果是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1307831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com