Почему `std :: stringstream :: stringstream (std :: string &&)` не существует? - PullRequest
0 голосов
/ 25 июня 2018

Я надеялся, что stringstream имеет конструктор, который крадет его начальное содержимое из string&&. Разве таких межвидовых «конструкторов перемещения» вообще не существует в STL? Если нет, то почему?

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Есть история, которая разочаровывает. Но и будущее, которое выглядит ярко.

Когда семантика перемещения вошла в C ++ 11, она была огромной, противоречивой и подавляющей. Я хотел иметь возможность перемещать строки в и из stringstream. Однако тогдашняя политика требовала, чтобы внутреннее хранилище не имело , чтобы быть basic_string<charT>. Например, внутреннее хранилище может быть vector. И не было возможности контролировать вещи с помощью распределителя. В любом случае, необходимость была признана во временном интервале C ++ 11, но это был просто мост слишком далеко.

К счастью, Питер Соммерлад поднял провал с P0408 . Это предложение добавляет функциональность, которую вы ищете, надеемся, для C ++ 20, но это еще не определено. Он успешно прошел через LEWG и сейчас находится на столе LWG. Они не добрались до этого месяца в Рапперсвиле, просто из-за перегруженного графика. Я надеюсь, что это пройдет через LWG и полное голосование в комитете. Это, безусловно, будет иметь мой голос.

0 голосов
/ 25 июня 2018

Почему std::stringstream::stringstream(std::string&&) не существует?

Это связано с внутренним буфером std::stringstream, rdbuf.

rdbuf, (тип std::string_buf), не поддерживает доступ non-copy согласно мотивации в предложении, p0408r4 :

... имеется нет без копирования доступ к внутреннему буферу basic_stringbuf, который делает по крайней мере получение вывода результат ostringstream неэффективного , потому что копия всегда сделал

Однако уже есть план поддержки перемещения std::string в конструкторе stringsteam:

explicit basic_ostringstream(
   basic_string<charT, traits, Allocator>&& str,
   ios_base::openmode which = ios_base::out,
   const Allocator& a = Allocator());

И двигаться str()

template<class SAlloc = Allocator>
void str(basic_string<charT, traits, SAlloc>&& s);
...