string_view Verhalten beim Übergeben der temporären std :: string

8

Ich habe gerade ein Missverständnis bekommen: zumindest in libc ++ -Implementierung std :: experimental :: string_view hat die folgende übersichtliche Implementierung:

%Vor%

Bedeutet diese Implementierung, dass wir, wenn wir einen rvalue-Ausdruck an diesen Konstruktor übergeben, ein undefiniertes Verhalten erhalten, wenn wir __data nach der Konstruktion verwenden?

    
Bikineev 17.11.2014, 17:22
quelle

1 Antwort

13

Das stimmt. A string_view ist ein nicht besitzender Wrapper mit Referenzsemantik, der nur dann verwendet werden darf, wenn die referenzierte Zeichenfolge die Verwendung der Ansicht überlebt.

Der typische Anwendungsfall ist in Funktionsparametern, wo die tatsächliche Zeichenfolge für die Dauer des Funktionsaufrufs lebt und der Funktionskörper die Ansicht nie speichert, sondern nur liest :

%Vor%

Verwendung:

%Vor%

Die Moral ist: Wenn Sie nur die Zeichenfolge für die Dauer des Funktionskörpers benötigen, geben Sie der Funktion einen string_view -Parameter, und sie kann einheitlich an jede Art von Stringoid-Argument binden. Sie benötigen keine Funktionsvorlage, das Kopieren von string_view s ist billig und Sie erhalten einige ordentliche Substring-Operationen kostenlos. Im Gegensatz dazu speichert niemals string_view , speichert aber immer string :

%Vor%     
Kerrek SB 17.11.2014, 17:54
quelle