Konvertierung von std::string_view std::string ist implizit. Was zum Teufel hatte Committee denken?
Ernst, was ist nicht bis. Es ist eine implizite Konvertierung von std::string
zu std::string_view
und es nicht als unsicher. Auch wenn dies sicherlich dazu führen, eine Menge hängende Referenzen, wenn die Programmierer nicht aufpassen.
Auf der anderen Seite, die Sie abgewiesen haben eine implizite Konvertierung von std::string_view
zu std::string
mit demselben argument, jedoch in völlig entgegengesetzte Art und Weise: , weil die Programmierer können nicht vorsichtig.
Es ist schön, dass Sie erstellt haben, ein Ersatz für eine raw - const char*
Zeiger und macht es super verwirrend und gestrippt bis auf die Knochen:
- Implizite
const char*
->std::string
: OK - Implizite
std::string_view
->std::string
: NÖ - Zuordnung
std::string
=const char*
: OK - Zuordnung
std::string
=std::string_view
: OK - Anhängen
std::string
+=const char*
: OK - Anhängen
std::string
+=std::string_view
: OK - Verkettung
const char*
+std::string
: OK - Verkettung
std::string_view
+std::string
: NÖ - Verkettung
std::string
+const char*
: OK - Verkettung
std::string
+std::string_view
: NÖ
Bin ich etwas fehlt, oder ist das ein totaler Unsinn?
In der Ende, wie sinnvoll ist diese Zeichenfolge anzuzeigen, ohne alle wichtigen Stücke, die machen es ähnlich wie const char*
? Was ist der Punkt, der die Integration in das ökosystem der stdlib zwar nicht, den letzten Schritt, um es vollständig zu machen? Nach allem, wenn wir gerade brauchen würde, dass ein Objekt, das stellt ein Stück einer Schnur konnten wir unsere eigene schreiben. Tatsächlich, eine Menge von Bibliotheken, die schon seit Jahren. Der springende Punkt, dass Sie etwas standard ist, ist es nützlich für die unterschiedlichsten Anwendungsfälle, nicht wahr?
Sind Sie gehen, um dieses Problem beheben in C++2a?
- Ich werde die Abstimmung zu schließen, ist diese Frage off-topic, denn das ist keine Frage, dies ist ein rant.
- Dies ist wahrscheinlich gehört zur reddit.com/r/cpp (einige C++ - Komitee-Mitgliedern Lesen.)
- Es scheint etwas unfair, dass diese Frage, deren Erörterung würde helfen, viele Programmierer, die geschlossen wurde
- dies ist in der Tat eine Frage. Es ist auch ein rant, aber das heißt nicht, dass es nicht die Frage. Die OP ist Ausdruck legitimen Schock, völlig verständlich, IMO, die überhaupt nicht davon ablenken, dass die technische Legitimität und Nützlichkeit in Frage. Es wäre toll, wenn die Frage könnte wieder geöffnet werden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass
std::string_view
->std::string
macht einen kopieren der zugrunde liegende Speicher, komplett mit heap-Allokation, in der Erwägung, dass die implizitestd::string
->std::string_view
nicht. Wenn Sie sich schon die Mühe gemacht, zu verwendenstd::string_view
in den ersten Platz, dann werden Sie natürlich kümmern kopiert, so dass Sie nicht möchten, dass ein geschehen implizit.Betrachten Sie dieses Beispiel:
Die Funktion
foo2
könnte verwendet habenconst std::string&
parameter, sondern verwendet einestd::string_view
so, dass es effizienter ist, wenn Sie übergeben einen string, der nicht in einerstd::string
; keine überraschungen gibt. Aber es ist weniger effizient, als wenn Sie hatte gerade einenconst std::string&
parameter!foo2
genannt wird, mit einemstd::string
argument (z.B. durchfoo1
): Wennfoo2
Anrufefoo3
es erstellt eine Kopie des Strings. Wenn es eineconst std::string&
argument, könnte es verwendet habe, das Objekt, das es schon hatte.foo2
genannt wird, mit einemconst char*
argument: Einstd::string
Kopie gemacht werden muss, früher oder später; mit einemconst std::string&
parameter bekommt es früher gemacht, aber insgesamt gibt es genau eine Kopie oder so.Nun stellen Sie sich vor
foo2
ruft mehrere Funktionen wiefoo3
oder Anrufefoo3
in eine Schleife; es macht genau das gleichestd::string
Objekt über und über. Sie würde wollen, dass der compiler benachrichtigt Sie über diese.std::string_view
dient der Optimierung der Analyse eines Strings. Das Ergebnis der Analyse, natürlich, kann nicht gespeichert werden, in einer Ansicht, so sollte es auch übertragen werden auf einen dauerhaften Speicher (std::string
). Warum sollte es so ausführlich? Nach alle, ich bin in der Steuerung und der i sollte wissen, wo anzeigen kann umgewandelt werden.std::string_view
auch schlecht. Auch Programmierer, sehenfoo1()
undfoo3()
sollte wissen über conversions. Und wenn wir das alles ignorieren, wie funktioniert explizite hilft in deinem Beispiel? Wegen der schlechten design, Programmierer noch gezwungen, erstellenstd::string
, nicht wahr?foo3
dauertconst std::string&
? Das war sehr Häufig, vorstd::string_view
existierte, und es ist eine Menge code herumliegen. Oder die Umsetzung vonfoo2
? Da Stimme ich (obwohl es schlecht ist, die Umsetzung nicht schlecht, design), aber es kann leicht passieren, durch Zufall, und Sie würden wollen, dass der compiler, um ihn zu fangen.std::string
mehrere Male, Sie entscheiden konnte, zu konstruieren, die es einmal am Anfang der Funktion und verwenden es für mehrere Funktionsaufrufe. Oder Sie könnte sich ändern, die Funktion der Signatur zu nehmenconst std::string&
.