Warum ist std::string_view::data() nicht gezwungenermaßen '\0' terminiert?
-
std::string und C-Style strings sind ja auch null terminiert. Finde es blöd, dass ich dann nicht einen string_view nehmen kann, und dann an eine C-API daraus einen C-String übergeben kann!
-
Wo soll das '\0' denn herkommen?
Beispiel von cppreference:char array[3] = {'B', 'a', 'r'}; std::string_view array_v(array, sizeof array);
-
string_view heißt ja nicht, dass der view auf dem ganzen string liegt. Der view kann sich doch auch nur auf einen Teil beziehen. string_view hält selbst ja keine Daten (nur Pointer + Length), kann also auch nicht wissen, wann der view nun '\0' enthält und wann nicht, string::data aber schon.
-
std::string ist nicht zwingend nullterminiert - erst durch .c_str() wird dies für den Rückgabewert garantiert (es kann trotzdem sein, daß der ursprüngliche Inhalt schon aus '\0' besteht, so daß der nulltermnierte String kürzer sein kann als .size()).
-
Th69 schrieb:
std::string ist nicht zwingend nullterminiert - erst durch .c_str() wird dies für den Rückgabewert garantiert
Das dürfte mit C++11 nicht mehr so sein. data() liefert einen terminierten String und operator[] an Position size() ein '\0'.
-
OK habe verstanden, danke.
-
manni66 schrieb:
Th69 schrieb:
std::string ist nicht zwingend nullterminiert - erst durch .c_str() wird dies für den Rückgabewert garantiert
Das dürfte mit C++11 nicht mehr so sein. data() liefert einen terminierten String und operator[] an Position size() ein '\0'.
Das genügt nicht.
Es wäre zu zeigen, dass für einen nicht-leeren string s und
auto p = &s.front();
in Folge stets
p[s.size()] == 0
gilt, auch wenn der String verändert wird, solange keine Reallokation, move oder swap aufgetreten sind (also p nicht invalidiert wird).
-
OK, wieder was gelernt: std::basic_string::operator[] erlaubt wirklich ab C++11 Zugriffe auf s[s.size()]. Was mich jedoch dann verwundert, ist, daß std::basic_string::at da jedoch (weiterhin) eine Exception wirft. Also kann man nicht einfach alle Aufrufe von [] durch at ersetzen!?
-
Th69 schrieb:
OK, wieder was gelernt: std::basic_string::operator[] erlaubt wirklich ab C++11 Zugriffe auf s[s.size()]. Was mich jedoch dann verwundert, ist, daß std::basic_string::at da jedoch (weiterhin) eine Exception wirft. Also kann man nicht einfach alle Aufrufe von [] durch at ersetzen!?
Was willst du überhaupt von
at
? Wenn man debuggen möchte, kann man die entsprechende stdlib-Option einsetzen. Frage mich, was diese Funktion überhaupt in sequentiellen Containern verloren hat.