stl copy and istream_iterator and operator >>

Discussion in 'C++' started by persres@googlemail.com, Sep 18, 2011.

  1. Guest

    Hi,
    I have the following code -

    string str("12 3213 asdf 21");
    vector<int> v;

    copy(istream_iterator<int>(istringstream(str)) ,
    istream_iterator<int>(), back_inserter(v) );

    I expected copy to throw because the operator >> would have failed due
    to the 'asdf' string present.
    However, it doesn't throw. Do you know why,
    How can i get it to throw or return an errror.
     
    , Sep 18, 2011
    #1
    1. Advertising

  2. Ian Collins Guest

    On 09/19/11 09:27 AM, wrote:
    > Hi,
    > I have the following code -
    >
    > string str("12 3213 asdf 21");
    > vector<int> v;
    >
    > copy(istream_iterator<int>(istringstream(str)) ,
    > istream_iterator<int>(), back_inserter(v) );


    This shouldn't compile. You can't create an istream_iterator from a
    temporary.

    > I expected copy to throw because the operator>> would have failed due
    > to the 'asdf' string present.


    Which operator >>?

    > However, it doesn't throw. Do you know why,


    Because the code doesn't do what you think it does (assuming you get it
    to compile). Have a look at the vector contents.

    > How can i get it to throw or return an errror.


    You can provide your own input iterator type.

    --
    Ian Collins
     
    Ian Collins, Sep 18, 2011
    #2
    1. Advertising

  3. Guest

    Re: stl copy and istream_iterator and operator >>

    On Sep 18, 10:47 pm, Ian Collins <> wrote:
    > On 09/19/11 09:27 AM, wrote:
    >
    > > Hi,
    > >      I have the following code -

    >
    > > string str("12 3213 asdf 21");
    > > vector<int>  v;

    >
    > > copy(istream_iterator<int>(istringstream(str)) ,
    > > istream_iterator<int>(),  back_inserter(v) );

    >
    > This shouldn't compile. You can't create an istream_iterator from a
    > temporary.
    >
    > > I expected copy to throw because the operator>>  would have failed due
    > > to the 'asdf' string present.

    >
    > Which operator >>?
    >
    > > However, it doesn't throw.  Do you know why,

    >
    > Because the code doesn't do what you think it does (assuming you get it
    > to compile).  Have a look at the vector contents.
    >
    > > How can i get it to throw or return an errror.

    >
    > You can provide your own input iterator type.
    >
    > --
    > Ian Collins


    It does compile and works as expected. This is standard way of
    copying.
     
    , Sep 18, 2011
    #3
  4. Ian Collins Guest

    Re: stl copy and istream_iterator and operator >>

    On 09/19/11 09:53 AM, wrote:
    > On Sep 18, 10:47 pm, Ian Collins<> wrote:
    >> On 09/19/11 09:27 AM, wrote:
    >>
    >>> Hi,
    >>> I have the following code -

    >>
    >>> string str("12 3213 asdf 21");
    >>> vector<int> v;

    >>
    >>> copy(istream_iterator<int>(istringstream(str)) ,
    >>> istream_iterator<int>(), back_inserter(v) );

    >>
    >> This shouldn't compile. You can't create an istream_iterator from a
    >> temporary.
    >>
    >>> I expected copy to throw because the operator>> would have failed due
    >>> to the 'asdf' string present.

    >>
    >> Which operator>>?
    >>
    >>> However, it doesn't throw. Do you know why,

    >>
    >> Because the code doesn't do what you think it does (assuming you get it
    >> to compile). Have a look at the vector contents.
    >>
    >>> How can i get it to throw or return an errror.

    >>
    >> You can provide your own input iterator type.


    Please don't quote signatures

    > It does compile and works as expected. This is standard way of
    > copying.


    I'd better try it then...

    cat x.cc
    #include <vector>
    #include <iostream>
    #include <string>
    #include <sstream>
    #include <iterator>

    using namespace std;

    int main() {
    string str("12 3213 asdf 21");
    vector<int> v;

    copy(istream_iterator<int>(istringstream(str)) ,
    istream_iterator<int>(), back_inserter(v) );
    }

    g++ x.cc

    x.cc: In function ‘int main()’:
    x.cc:13:48: error: no matching function for call to
    ‘std::istream_iterator<int>::istream_iterator(std::istringstream)’

    CC x.cc
    "x.cc", line 13: Error: Cannot cast from std::istringstream to
    std::istream_iterator<int, char, std::char_traits<char>, int>.

    --
    Ian Collins
     
    Ian Collins, Sep 18, 2011
    #4
  5. Guest

    Re: stl copy and istream_iterator and operator >>

    http://www.sgi.com/tech/stl/istream_iterator.html

    I am using a temporary. I suppose the life time of the temporary will
    be valid until copy is done.

    I am in VS 2008.

    there is a constructore like this -

    istream_iterator(istream_type& _Istr)
    : _Myistr(&_Istr)
    { // construct with input stream
    _Getval();
    }

    where
    typedef basic_istream<_Elem, _Traits> istream_type;
     
    , Sep 18, 2011
    #5
  6. Ian Collins Guest

    On 09/19/11 09:47 AM, Ian Collins wrote:
    > On 09/19/11 09:27 AM, wrote:
    >> Hi,
    >> I have the following code -
    >>
    >> string str("12 3213 asdf 21");
    >> vector<int> v;
    >>
    >> copy(istream_iterator<int>(istringstream(str)) ,
    >> istream_iterator<int>(), back_inserter(v) );

    >
    > This shouldn't compile. You can't create an istream_iterator from a
    > temporary.
    >
    >> I expected copy to throw because the operator>> would have failed due
    >> to the 'asdf' string present.

    >
    > Which operator>>?


    I wasn't being very helpful there (Monday morning).
    std::istream_iterator will stop after the first extraction failure, so
    if you want more error checking you will have to roll your own.

    --
    Ian Collins
     
    Ian Collins, Sep 18, 2011
    #6
  7. red floyd Guest

    Re: stl copy and istream_iterator and operator >>

    On 9/18/2011 3:11 PM, wrote:
    > http://www.sgi.com/tech/stl/istream_iterator.html
    >
    > I am using a temporary. I suppose the life time of the temporary will
    > be valid until copy is done.
    >
    > I am in VS 2008.
    >
    > there is a constructore like this -
    >
    > istream_iterator(istream_type& _Istr)
    > : _Myistr(&_Istr)
    > { // construct with input stream
    > _Getval();
    > }
    >
    > where
    > typedef basic_istream<_Elem, _Traits> istream_type;
    >


    Turn on /Za. What you're seeing is a MS extension.
    You can't pass a temporary to a function expecting a
    non-const reference.

    MS allows it as an extension.
     
    red floyd, Sep 18, 2011
    #7
  8. Ian Collins Guest

    Re: stl copy and istream_iterator and operator >>

    On 09/19/11 10:11 AM, wrote:
    > http://www.sgi.com/tech/stl/istream_iterator.html
    >
    > I am using a temporary. I suppose the life time of the temporary will
    > be valid until copy is done.
    >
    > I am in VS 2008.
    >
    > there is a constructore like this -
    >
    > istream_iterator(istream_type& _Istr)
    > : _Myistr(&_Istr)
    > { // construct with input stream
    > _Getval();
    > }
    >
    > where
    > typedef basic_istream<_Elem, _Traits> istream_type;


    I temporary should have the type "const istream_type", so the matching
    function signature would be istream_iterator(const istream_type& _Istr).

    --
    Ian Collins
     
    Ian Collins, Sep 18, 2011
    #8
  9. James Kanze Guest

    Re: stl copy and istream_iterator and operator >>

    On Sep 18, 11:23 pm, Ian Collins <> wrote:
    > On 09/19/11 10:11 AM, wrote:
    > >http://www.sgi.com/tech/stl/istream_iterator.html


    > > I am using a temporary. I suppose the life time of the temporary will
    > > be valid until copy is done.


    > > I am in VS 2008.


    > > there is a constructore like this -


    > > istream_iterator(istream_type& _Istr)
    > > : _Myistr(&_Istr)
    > > { // construct with input stream
    > > _Getval();
    > > }


    > > where
    > > typedef basic_istream<_Elem, _Traits> istream_type;


    > I temporary should have the type "const istream_type", so the matching
    > function signature would be istream_iterator(const istream_type& _Istr).


    The temporary has the type std::istringstream. But C++ doesn't
    allow initializing a reference to a non-const with an rvalue.
    (Hasn't, in fact, since something like 1988.) The type (and the
    const-ness of the type) doesn't enter into it, at least for the
    initializer.

    --
    James Kanze
     
    James Kanze, Sep 19, 2011
    #9
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Replies:
    1
    Views:
    561
    Victor Bazarov
    Jun 24, 2005
  2. George
    Replies:
    6
    Views:
    818
    George
    Dec 19, 2005
  3. Replies:
    4
    Views:
    832
    Daniel T.
    Feb 16, 2006
  4. Replies:
    26
    Views:
    2,181
    Roland Pibinger
    Sep 1, 2006
  5. Pradeep
    Replies:
    5
    Views:
    1,115
    =?ISO-8859-1?Q?Jens_M=FCller?=
    Oct 19, 2006
Loading...

Share This Page