Unerklärliche Diskrepanzen beim Kopieren und Ändern von std :: strings

8

Im folgenden Code funktioniert "situation 1" wie erwartet auf allen Compiler getestet, aber "Situation 2" scheint sich anders zu verhalten basierend auf dem verwendeten Compiler.

Als Beispiel hat MSVC sit1 und sit2 die gleichen Ergebnisse liefern Wenn Sie gcc / clang und libstdc ++ verwenden, wird die Änderung an der Original-String und es ist Kopie (Art wie eine COW-Zeichenfolge) obwohl Ich baue mit dem C ++ 11-Schalter.

%Vor%

GCC (6.1)

%Vor%

MSVC (2015)

%Vor%

Gibt es einen Grund für die Diskrepanzen im Verhalten zwischen den verschiedenen Compilern - vorausgesetzt, dass & amp; x0 [0] und .data () die gleiche Adresse zurückgeben?

    
Jacobi John 16.08.2016, 22:16
quelle

1 Antwort

15

Situation 2 verursacht undefiniertes Verhalten:

%Vor%

Gemäß der Spezifikation von std::basic_string::data (C ++ 14 [string.accessors] / 3):

  

Erfordert: Das Programm darf keinen der im Zeichen-Array gespeicherten Werte verändern.

Mit anderen Worten, Sie dürfen const nicht wegwerfen und die Zeichenfolge über die von data() oder c_str() zurückgegebenen Zeiger ändern.

    
M.M 16.08.2016, 22:21
quelle

Tags und Links