§21.4.5 [string.access]
Gibt zurück:
*(begin() + pos)
ifpos < size()
. Andernfalls wird eine Referenz auf ein Objekt vom TypcharT
mit dem WertcharT()
zurückgegeben, wobei die Änderung des Objekts zu undefiniertem Verhalten führt.
Der zweite Teil bedeutet zumindest für mich, dass dieses "Objekt vom Typ charT
" sich außerhalb der im Objekt std::string
gespeicherten Sequenz befinden darf. Beispielhafte Implementierung eines konformen operator[]
:
Nun, c_str()
/ data()
, werden in operator[]
angegeben:
§21.4.7 [string.accessors]
Rückgabe: Ein Zeiger
p
, so dassp + i == &operator[](i)
für jedeni
in[0,size()]
.
Dies würde die obige operator[]
Implementierung nicht konform machen, wie p + size() != &operator[](size())
. Mit ein bisschen Tricks können Sie dieses Problem jedoch umgehen:
Nun, die offensichtliche Frage ist ...
Ist der obige Code wirklich konform oder habe ich etwas übersehen?
Ich ignoriere den gegebenen Code und denke nur an die Frage, ich denke das
Daher scheint es ein Defekt zu sein.
Überprüfung der Liste bekannter Bibliotheksfehler Offenbar wurde dieses Problem noch nicht gemeldet.
Also, wie ich im Chat gesagt habe, empfehle ich es in [comp.std.c ++] zu posten, um die Frage zu klären, ob wirklich ein Defekt ist, und wenn ja, um es in die Fehlerliste zu bekommen und zu beheben.
Ich sehe nicht, wie es konform sein könnte. Benutzercode kann niemals den versprochenen zurückgegebenen Wert einhalten. Das assert
im Code ist irreführend, weil es an der falschen Stelle ist: Die Funktion wurde noch nicht zurückgegeben. Rückgabe: Anforderungen gelten für den Wert, der von der Funktion zurückgegeben wird, nicht für einen Wert innerhalb der Implementierung (es sollte offensichtlich sein, warum dies eine unsinnige Idee ist).
Die Behauptung sollte hier sein:
%Vor% Ich glaube, die Formulierung, die s[s.size()]
speziell behandelt, soll Ihnen einfach verbieten, den Nullterminator in die Luft zu jagen.
Tags und Links string c++ c++11 language-lawyer