This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of C++11 status.

### 900. Stream move-assignment

Section: 29.10.3.3 [ifstream.assign] Status: C++11 Submitter: Niels Dekker Opened: 2008-09-20 Last modified: 2016-01-28

Priority: Not Prioritized

View all issues with C++11 status.

Discussion:

It appears that we have an issue similar to issue 675 regarding the move-assignment of stream types. For example, when assigning to an `std::ifstream`, `ifstream1`, it seems preferable to close the file originally held by `ifstream1`:

>     ifstream1 = std::move(ifstream2);

The current Draft (N2723) specifies that the move-assignment of stream types like `ifstream` has the same effect as a swap:

> Assign and swap 29.10.3.3 [ifstream.assign]

>     basic_ifstream& operator=(basic_ifstream&& rhs);

> > Effects: `swap(rhs)`.

[ Batavia (2009-05): ]

> Howard agrees with the analysis and the direction proposed.

> Move to Open pending specific wording to be supplied by Howard.

[ 2009-07 Frankfurt: ]

> Howard is going to write wording.

[ 2009-07-26 Howard provided wording. ]

[ 2009-09-13 Niels adds: ]

> Note: The proposed change of 29.10.2.3 [filebuf.assign] p1 depends on the resolution of LWG 1204, which allows implementations to assume that `*this` and `rhs` refer to different objects.

[ 2009 Santa Cruz: ]

> Leave as Open. Too closely related to 911 to move on at this time.

[ 2010 Pittsburgh: ]

> Moved to Ready for Pittsburgh.

Proposed resolution:

Change 29.8.2.3 [stringbuf.assign]/1:

>     basic_stringbuf& operator=(basic_stringbuf&& rhs);

> > -1- Effects: `swap(rhs)`. After the move assignment `*this` reflects the same observable state it would have if it had been move constructed from `rhs` (29.8.2.2 [stringbuf.cons]).

Change 29.8.3.3 [istringstream.assign]/1:

>     basic_istringstream& operator=(basic_istringstream&& rhs);

> > -1- Effects: `swap(rhs)`. Move assigns the base and members of `*this` with the respective base and members of `rhs`.

Change 29.8.4.3 [ostringstream.assign]/1:

>     basic_ostringstream& operator=(basic_ostringstream&& rhs);

> > -1- Effects: `swap(rhs)`. Move assigns the base and members of `*this` with the respective base and members of `rhs`.

Change 29.8.5.3 [stringstream.assign]/1:

>     basic_stringstream& operator=(basic_stringstream&& rhs);

> > -1- Effects: `swap(rhs)`. Move assigns the base and members of `*this` with the respective base and members of `rhs`.

Change 29.10.2.3 [filebuf.assign]/1:

>     basic_filebuf& operator=(basic_filebuf&& rhs);

> > -1- Effects: `swap(rhs)`. Begins by calling `this->close()`. After the move assignment `*this` reflects the same observable state it would have if it had been move constructed from `rhs` (29.10.2.2 [filebuf.cons]).

Change 29.10.3.3 [ifstream.assign]/1:

>     basic_ifstream& operator=(basic_ifstream&& rhs);

> > -1- Effects: `swap(rhs)`. Move assigns the base and members of `*this` with the respective base and members of `rhs`.

Change 29.10.4.3 [ofstream.assign]/1:

>     basic_ofstream& operator=(basic_ofstream&& rhs);

> > -1- Effects: `swap(rhs)`. Move assigns the base and members of `*this` with the respective base and members of `rhs`.

Change 29.10.5.3 [fstream.assign]/1:

>     basic_fstream& operator=(basic_fstream&& rhs);

> > -1- Effects: `swap(rhs)`. Move assigns the base and members of `*this` with the respective base and members of `rhs`.