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.


  • Mod

    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!?


  • Mod

    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.


Anmelden zum Antworten