wake-up-neo.com

Warum gibt es `std :: stringstream :: stringstream (std :: string &&)` nicht?

Ich hatte gehofft, dass stringstream einen Konstruktor hat, der seinen ursprünglichen Inhalt aus einem string&& Stiehlt. Existieren solche Inter-Spezies "Bewegungskonstruktoren" im Allgemeinen nicht in der STL? Wenn nein, warum nicht?

48
Museful

Es gibt Geschichte, die enttäuschend ist. Aber auch eine Zukunft, die vielversprechend aussieht.

Als die Verschiebungssemantik in C++ 11 eingeführt wurde, war sie riesig, kontrovers und überwältigend. Ich wollte in der Lage sein, Zeichenfolgen in undaus stringstream zu verschieben. Die damalige Politik verlangte jedoch, dass der interne Speicher kein basic_string<charT> Sein sollte. Beispielsweise könnte der interne Speicher ein vector sein. Und es gab keine Möglichkeit, die Dinge mit einem Allokator zu steuern. In jedem Fall wurde der Bedarf im C++ 11-Zeitrahmen erkannt, aber es war nur eine Brücke zu weit.

Zum Glück hat Peter Sommerlad die Pause mit P0408 aufgegriffen. Dieser Vorschlag fügt die Funktionalität hinzu, die Sie hoffentlich für C++ 20 suchen, aber das ist noch nicht sicher. Es hat die LEWG erfolgreich durchlaufen und liegt derzeit auf dem Schreibtisch der LWG. Sie haben es in diesem Monat in Rapperswil nicht geschafft, allein wegen eines überlasteten Zeitplans. Ich bin zuversichtlich, dass es durch die LWG geht und der gesamte Ausschuss abstimmt. Es wird sicherlich meine Stimme haben.

55
Howard Hinnant

Warum existiert std::stringstream::stringstream(std::string&&) nicht?

Dies liegt am internen Puffer von std::stringstream , rdbuf .

rdbuf, (Typ std::string_buf ), unterstützt nicht keine Kopie Zugriff gemäß der Motivation im Vorschlag, - p0408r4 :

... gibt es keinen kein Kopieren Zugriff auf den internen Puffer eines basic_stringbuf welches Mindestens das Erhalten der Ausgabe ergibt sich aus einem ostringstream ineffizient, da immer eine Kopie erstellt wird

Es ist jedoch bereits geplant, std::string Im Konstruktor von stringsteam zu unterstützen:

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

UND verschiebe str()

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