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?
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.
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 einemostringstream
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);