, "상황 1"그러나 테스트 한 모든 컴파일러에 예상대로 작품, "상황이" 익숙한.설명 할 수없는 차이가 컴파일러에 따라 다르게 행동 것으로 보인다 복사 및 수정 표준 : : 문자열 다음 코드에서
예로 MSVC는 sit1을 갖고 있지만 , 변형이 원래 문자열 발생 ++ GCC/연타 및 된 libstdc를 사용하는 경우, 동일한 결과를 sit2 그리고 비록 (일종의 COW 문자열 등)를 복사 있어 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는 (2,015)
1. x0: 123 5678
1. x1: 12345678
1. ptrs are equal
2. x0: 123 5678
2. x1: 12345678
2. ptrs are equal
다양한 컴파일러 사이의 동작의 차이에 대한 이유가 - 주어진 & X0 [0] .data()는 동일한 주소를 반환합니까?
[이 GCC 6.1] (http://melpon.org/wandbox/permlink/cJZq0ey2qv526sJU)은 올바르게 동작합니다. –
정말로'4'를'Z'로 대체해야합니까? 'l'과 'I'처럼 시각적으로 구별하기가 더 어려운 것을 찾을 수 없습니까? SO에 관한 질문을하는 재미의 절반은 누군가가 중요한 세부 사항을 발견하는 것을 가능한 한 어렵게 만듭니다. –
나는 당신이 너 자신을 쓰지 않은 고대의 끔찍한 코드를 이식하고 있기 때문에 이것을 묻고 싶다. –