0
g++
및 clang++
을 사용하는 경우 ++my string==my string##my string--
이 표시됩니다. MSVC 및 인텔 컴파일러는 ++==my string##my string--
입니다.C++ string.c_str()
왜?
#include <string>
#include <iostream>
using namespace std;
string test()
{
string s0 = "my string";
return s0;
}
int main()
{
string s = test();
const char* s1 = test().c_str();
const char* s2 = s.c_str();
cout << "++" << s1 << "==" << s2 << "##" << test().c_str() << "--" << endl;
return 0;
}
정의되지 않은 동작입니까? 코멘트에서
's1'은 더 이상 존재하지 않는 객체를 가리 킵니다. 그것에서 읽는 것은 명확히 정의되지 않은 행동입니다. –
정의되지 않은 동작을 "코드에서 어셈블러로 정의되지 않은 변환"과 혼동하지 마십시오. 관찰 가능한 동작 (용어가 언어로 정의됨에 따라)이 동일하게 유지되면 컴파일러는 어떤 방식 으로든 코드를 변형 할 수 있습니다. 그것은 [as-if 규칙] (http://en.cppreference.com/w/cpp/language/as_if)으로 알려져 있습니다. –
[C++에서 임시 객체를 반환하는 혼동] 가능한 복제본 (https://stackoverflow.com/questions/12952295/c-returning-temporary-objects-confusion) – wally