Section: 31.10.4 [ifstream] Status: C++11 Submitter: Niels Dekker Opened: 2008-09-20 Last modified: 2023-02-07
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 [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 31.10.3.3 [filebuf.assign] p1 depends on the resolution of LWG 1204, which allows implementations to assume that
*this
andrhs
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 31.8.2.3 [stringbuf.assign]/1:
basic_stringbuf& operator=(basic_stringbuf&& rhs);-1- Effects:
After the move assignmentswap(rhs)
.*this
reflects the same observable state it would have if it had been move constructed fromrhs
(31.8.2.2 [stringbuf.cons]).
Change [istringstream.assign]/1:
basic_istringstream& operator=(basic_istringstream&& rhs);-1- Effects:
Move assigns the base and members ofswap(rhs)
.*this
with the respective base and members ofrhs
.
Change [ostringstream.assign]/1:
basic_ostringstream& operator=(basic_ostringstream&& rhs);-1- Effects:
Move assigns the base and members ofswap(rhs)
.*this
with the respective base and members ofrhs
.
Change [stringstream.assign]/1:
basic_stringstream& operator=(basic_stringstream&& rhs);-1- Effects:
Move assigns the base and members ofswap(rhs)
.*this
with the respective base and members ofrhs
.
Change 31.10.3.3 [filebuf.assign]/1:
basic_filebuf& operator=(basic_filebuf&& rhs);-1- Effects:
Begins by callingswap(rhs)
.this->close()
. After the move assignment*this
reflects the same observable state it would have if it had been move constructed fromrhs
(31.10.3.2 [filebuf.cons]).
Change [ifstream.assign]/1:
basic_ifstream& operator=(basic_ifstream&& rhs);-1- Effects:
Move assigns the base and members ofswap(rhs)
.*this
with the respective base and members ofrhs
.
Change [ofstream.assign]/1:
basic_ofstream& operator=(basic_ofstream&& rhs);-1- Effects:
Move assigns the base and members ofswap(rhs)
.*this
with the respective base and members ofrhs
.
Change [fstream.assign]/1:
basic_fstream& operator=(basic_fstream&& rhs);-1- Effects:
Move assigns the base and members ofswap(rhs)
.*this
with the respective base and members ofrhs
.