Ist eine std :: string-Implementierung konform, wobei 's.c_str () + s.size ()' nicht unbedingt dasselbe ist wie '& s [s.größe ()]'?

9

§21.4.5 [string.access]

%Vor%
  

Gibt zurück: *(begin() + pos) if pos < size() . Andernfalls wird eine Referenz auf ein Objekt vom Typ charT mit dem Wert charT() 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[] :

%Vor%

Nun, c_str() / data() , werden in operator[] angegeben:

§21.4.7 [string.accessors]

%Vor%
  

Rückgabe: Ein Zeiger p , so dass p + i == &operator[](i) für jeden i 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:

%Vor%

Nun, die offensichtliche Frage ist ...

Ist der obige Code wirklich konform oder habe ich etwas übersehen?

    
Xeo 04.08.2012, 15:37
quelle

2 Antworten

4

Ich ignoriere den gegebenen Code und denke nur an die Frage, ich denke das

  • Leider scheint die Antwort "ja" und
  • zu sein
  • das ist sicherlich nicht die Absicht des Standards.

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.

    
Cheers and hth. - Alf 04.08.2012 15:47
quelle
0

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.

    
R. Martinho Fernandes 05.08.2012 17:28
quelle

Tags und Links