webentwicklung-frage-antwort-db.com.de

Unterschied in der c_str-Funktionsspezifikation zwischen C++ 03 und C++ 11

In der C++ Referenz von c_str() in std::string erscheint Folgendes:

Rückgabewert
Zeiger auf den darunter liegenden Zeichenspeicher.
data()[i] == operator[](i) for every i in [0, size()) (bis C++ 11)
data() + i == &operator[](i) for every i in [0, size()] (seit C++ 11)

Ich verstehe den Unterschied zwischen den beiden nicht, mit Ausnahme der Bereichserhöhung um ein Element seit C++ 11.

Trifft die erste Aussage data()[i] == operator[](i) nicht auch für die letztere zu?

26
Chiel

Mit Ausnahme des Bereichsinkrements um ein Element seit C++ 11 besteht immer noch ein großer Unterschied zwischen:

data()[i] == operator[](i)

und:

data() + i == &operator[](i)

Dieser Hauptunterschied ist der &-Operator in den Prototypen. 

Der alte Prototyp erlaubte die Erstellung von copy, wenn eine Schreiboperation ausgeführt würde, da der zurückgegebene Zeiger auf einen anderen Puffer zeigen könnte als den, der die ursprüngliche Zeichenfolge enthält.

Der andere Unterschied in den Prototypen zwischen data()[i] und data() + i ist nicht kritisch, da sie äquivalent sind.


Ein Unterschied zwischen C++ und C++ 11 besteht darin, dass im ersten Code std::string vom Standard nicht explizit angegeben wurde, ob er ein Null-Terminator haben würde oder nicht. Im letzteren wird dies jedoch angegeben.

Mit anderen Worten: Wird std :: string in C++ 11 immer mit Null abgeschlossen? Ja.

20
gsamaras

Beachten Sie den Unterschied der schließenden Klammer:

[0, Größe ())

[0, Größe ()]

First steht für exklusiven Bereich (dh Element bei size Index ist nicht enthalten), während Zweite für Inclusive Range steht (dh Element bei size Index ist enthalten) In C++ 11 ist das Zeichen an der size()-Position eindeutig definiert.

Was den Unterschied zwischen data()[i] == operator[](i) und data() + i == &operator[](i) angeht, so werden im zweiten Abschnitt weitere Einschränkungen für die mögliche Implementierung angewendet. Im ersten Fall kann sich ein von data() zurückgegebener Zeiger auf den Puffer von dem Zeiger auf Puffer unterscheiden, in dem ein Wert gespeichert ist, auf den der von operator [] zurückgegebene Verweis gespeichert ist. Dies kann passieren, wenn ein neuer Puffer erstellt wurde, nachdem der Operator [] einer nicht konstanten Qualifikation des kopierten Strings aufgerufen wurde.

9
VTT

Vor C++ 11 wurde nicht angegeben, ob die Zeichenfolgendaten mit Nullen abgeschlossen wurden oder nicht. C++ 11 sagt, dass es nullterminiert sein muss.

0