2017-11-27 4 views
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; 
} 

정의되지 않은 동작입니까? 코멘트에서

+16

's1'은 더 이상 존재하지 않는 객체를 가리 킵니다. 그것에서 읽는 것은 명확히 정의되지 않은 행동입니다. –

+0

정의되지 않은 동작을 "코드에서 어셈블러로 정의되지 않은 변환"과 혼동하지 마십시오. 관찰 가능한 동작 (용어가 언어로 정의됨에 따라)이 동일하게 유지되면 컴파일러는 어떤 방식 으로든 코드를 변형 할 수 있습니다. 그것은 [as-if 규칙] (http://en.cppreference.com/w/cpp/language/as_if)으로 알려져 있습니다. –

+1

[C++에서 임시 객체를 반환하는 혼동] 가능한 복제본 (https://stackoverflow.com/questions/12952295/c-returning-temporary-objects-confusion) – wally

답변

6

, 당신은 질문 :

test().c_str()이 작동 할 수있는 이유하지만 s1하지?

test().c_str()은 모든 컨텍스트가 아닌 일부 컨텍스트에서만 작동합니다.

std::cout << test().c_str() << std::endl; 

은 명령문의 실행이 완료 될 때까지 살아 남기 위해 필요 test()에 의해 반환 된 임시 이후 작동을 보장한다. 임시가 첫 번째 줄의 실행이 완료 이상 살 필요하지 않기 때문에 다른 한편으로

,

char const* s1 = test().c_str(); 
std:cout << s1 << std::endl; 

은 정의되지 않은 동작입니다.

관련 문제