[
https://issues.apache.org/jira/browse/STDCXX-645?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12543180
]
Travis Vitek commented on STDCXX-645:
-------------------------------------
24.5.1 p1 says that an istream_iterator becomes an end-of-stream iterator when
the end of stream is reached. So checks are required so that two iterators that
become end-of-stream iterators will compare equal.
#include <assert.h>
#include <iterator>
#include <sstream>
int main ()
{
std::istringstream a ("1");
std::istream_iterator<int> i (a);
++i;
std::istringstream b ("2");
std::istream_iterator<int> j (b);
++j;
assert (i == j);
return 0;
}
This method needs to return true if both iterators are end-of-stream iterators,
or they have the same non-null stream pointer. Something like this is more
appropriate given the implementation of the other methods
template <class _TypeT, class _CharT, class _Traits, class _Distance>
bool
operator== (const istream_iterator<_TypeT, _CharT, _Traits, _Distance>& __x,
const istream_iterator<_TypeT, _CharT, _Traits, _Distance>& __y)
{
const bool __x_eos = !__x._C_strm || !*__x._C_strm;
const bool __y_eos = !__x._C_strm || !*__x._C_strm;
return (__x._C_strm == __y._C_strm) ? true : __x_eos == __y_eos;
}
The other option would be to change our internal definition of end-of-stream to
be istream_iterators with a NULL stream pointer. Then operator++ could be
changed to invalidate the stream pointer when the stream reaches eos. I think
this would work.
istream_iterator& operator++ () {
if (_C_strm && !!*_C_strm)
*_C_strm >> _C_val;
else
_C_strm = 0;
return *this;
}
> stream iterators into different streams compare equal
> -----------------------------------------------------
>
> Key: STDCXX-645
> URL: https://issues.apache.org/jira/browse/STDCXX-645
> Project: C++ Standard Library
> Issue Type: Bug
> Components: 24. Iterators
> Affects Versions: 4.1.3, 4.2.0
> Reporter: Mark Brown
>
> As Travis says in his reply to my post here:
> http://www.nabble.com/stream-iterators-into-different-streams-compare-equal--tf4721505.html#a13498487:
> Given 24.5.1.1 p1 and p2, it is pretty clear to me that the two iterators
> are both non-end-of-stream type, and they are both created on different
> streams. The streams are different, so the iterators should not compare
> equal. I guess one could claim that 24.5.1.2 p6 conflicts with 24.5 p3
> because 'end-of-stream' isn't clearly defined, but in this particular case
> that doesn't matter.
> This program aborts with stdcxx but not with gcc:
> #include <assert.h>
> #include <iterator>
> #include <sstream>
> int main ()
> {
> std::istringstream a ("1");
> std::istream_iterator<int> i (a);
> std::istringstream b ("2");
> std::istream_iterator<int> j (b);
> assert (!(i == j));
> }
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.