This is the mail archive of the mailing list for the libstdc++ project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RFC: Allow moved-from strings to be non-empty

When an SSO string is contained in the small string buffer or has an
unequal allocator a move operation performs a copy, leaving the original
data in the moved-from string. Setting the length of the moved-from
string to zero is not required, so we can avoid two writes (to the
length member and to set the first character to nul) by leaving the
moved-from string unchanged.

This might be surprising to some users, who (wrongly) expect a string
to always be empty after a move. Is that acceptable?

It's worth noting that the current behaviour, where we do more work
than required, also surprises some people, e.g.

Some tests need to be adjusted due to the new behaviour, but they have
comments saying they're testing specific implementation details, so I
don't think needing to adjust them is an argument against making the

// NOTE: This makes use of the fact that we know how moveable
// is implemented on string (via swap). If the implementation changed
// this test may begin to fail.

Should we make this change?

	* include/bits/basic_string.h [_GLIBCXX_USE_CXX11_ABI]
	(basic_string::basic_string(basic_string&&)): Only set length of
	source string to zero when allocated storage is transferred.
	(basic_string::operator=(basic_string&&)): Likewise. Split separate
	cases into separate conditionals.
	* testsuite/21_strings/basic_string/cons/char/ Adjust
	expected state of moved-from strings.
	* testsuite/21_strings/basic_string/cons/char/ Likewise.
	* testsuite/21_strings/basic_string/cons/char/
	* testsuite/21_strings/basic_string/cons/wchar_t/
	* testsuite/21_strings/basic_string/cons/wchar_t/
	* testsuite/21_strings/basic_string/cons/wchar_t/
	* testsuite/21_strings/basic_string/modifiers/assign/char/ Likewise.
	* testsuite/21_strings/basic_string/modifiers/assign/wchar_t/ Likewise.

Attachment: patch.txt
Description: Text document

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]