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?
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.
Tags und Links string c++ c++11 copy-constructor