Title
Missing requirements for basic_string::value_type
Status
new
Section
[strings.general]
Submitter
Jonathan Wakely

Created on 2015-06-26.00:00:00 last changed 103 months ago

Messages

Date: 2016-06-28.13:53:39

[ 2016-06, Oulu ]

This should be resolved by P0178

Note: P0178 was sent back to LEWG in Oulu.

Date: 2015-06-26.00:00:00

The allocator-aware container requirements in Table 98 impose no MoveAssignable requirements on the value_type when propagate_on_container_move_assignment is true, because typically the container's storage would be moved by just exchanging some pointers.

However for a basic_string using the small string optimization move assignment may need to assign individual characters into the small string buffer, even when the allocator propagates.

The only requirement on the char-like objects stored in a basic_string are that they are non-array POD types and Destructible, which means that a POD type with a deleted move assignment operator should be usable in a basic_string, despite it being impossible to move assign:

#include <string>

struct odd_pod 
{
  odd_pod() = default;
  odd_pod& operator=(odd_pod&&) = delete;
};

static_assert(std::is_pod<odd_pod>::value, "POD");

int main()
{
  using S = std::basic_string<odd_pod>;
  S s;
  s = S{};       // fails
}

Using libstdc++ basic_string<odd_pod> cannot even be default-constructed because the constructor attempts to assign the null terminator to the first element of the small string buffer.

Similar problems exist with POD types with a deleted default constructor.

I believe that basic_string should require its value_type to be at least DefaultConstructible and MoveAssignable.

History
Date User Action Args
2016-06-28 13:53:39adminsetmessages: + msg8214
2015-06-26 00:00:00admincreate