В следующем коде, «ситуация 1» работает как и ожидалось, на всех составителей тестируемых, однако «ситуация 2» это кажется ведут себя по-разному на основе компилятора используемый.Необъяснимые расхождения при копировании и модифицирующие СТД :: строки
В качестве примера MSVC имеет sit1 и sit2 дают одинаковые результаты, однако при использовании GCC/лязг и libstdC++, изменение происходит в исходной строки, и это копия (вроде строки КПС) даже если Я строю с использованием коммутатора C++ 11.
#include <iostream>
#include <string>
int main() {
// situation 1
{
std::string x0 = "12345678";
std::string x1 = x0;
char* ptr = &x0[0] + 3;
(*ptr) = ' ';
std::cout << "1. x0: " << x0 << "\n";
std::cout << "1. x1: " << x1 << "\n";
if ((&x0[0]) == x0.data()) std::cout << "1. ptrs are equal\n";
}
// situation 2
{
std::string x0 = "12345678";
std::string x1 = x0;
char* ptr = const_cast<char*>(x0.data() + 3);
(*ptr) = ' ';
std::cout << "2. x0: " << x0 << "\n";
std::cout << "2. x1: " << x1 << "\n";
if ((&x0[0]) == x0.data()) std::cout << "2. ptrs are equal\n";
}
return 0;
}
GCC (6,1)
1. x0: 123 5678
1. x1: 12345678
1. ptrs are equal
2. x0: 123 5678
2. x1: 123 5678
2. ptrs are equal
MSVC (2015)
1. x0: 123 5678
1. x1: 12345678
1. ptrs are equal
2. x0: 123 5678
2. x1: 12345678
2. ptrs are equal
Есть ли причина расхождений в поведении между различными компиляторами - при условии, что & х0 [0] и .data() возвращают тот же адрес?
[Этот GCC 6.1] (http://melpon.org/wandbox/permlink/cJZq0ey2qv526sJU) ведет себя правильно. –
Вы действительно должны были заменить '4' на' Z'? Не могли бы вы найти что-то, что еще труднее отличить визуально, например 'l' и' I'? Половина удовольствия задавать вопросы на SO делает все возможное, чтобы кто-нибудь мог определить важные детали. –
Я действительно надеюсь, что вы спросите об этом, потому что вы портируете древний, ужасный код, который вы сами не пишете. –