2009-08-27 7 views
20
일시적

로 돌아 참조 나는 warning: returning reference to temporary를 얻을이경고 :

const string &SomeClass::Foo(int Value) 
{ 
    if (Value < 0 or Value > 10) 
     return ""; 
    else 
     return SomeClass::StaticMember[i]; 
} 

같은 기능을 가지고있다. 왜 그런가요? 함수가 리턴하는 두 값 (const char *에 대한 참조 및 정적 멤버에 대한 참조)은 일시적 일 수 없다고 생각했습니다.

답변

43

이것은 원하지 않는 암시 적 변환이 발생할 때의 예입니다. ""std::string이 아니므로 컴파일러는이를 하나로 변환하려고 시도합니다. 그리고 string(const char* str) 생성자를 사용하면 그 시도가 성공합니다. std::string의 임시 인스턴스가 만들어져 메서드 호출이 끝날 때 삭제됩니다. 따라서 메서드 호출 후에 더 이상 존재하지 않을 인스턴스를 참조하는 것은 분명히 좋은 생각이 아닙니다.

반환 유형을 const string으로 변경하거나 ""을 멤버 또는 정적 변수 SomeClass에 저장하는 것이 좋습니다.

+13

좋은 대답입니다! 여기에 왜 C++은 요즘 프로그래밍 문제에 좋은 선택이 아니라고 생각합니다. 그것은 당신이 손에서 문제에 집중하는 것을 선호 할 때 당신의 내부 작업을 돌보는 데 시간을 소비 할 것입니다. –

+13

@ 루이스 (Luis) : 언급할만한 모든 언어에는이 코너 케이스가 있습니다. –

+1

변환이 * 여기 * 원했던 것 같습니다! : P 값으로 반환하기로 변경하면 const도 삭제해야합니다. –

5

문제는 첫 번째 줄에 있습니다. ""char*을 취하는 유효한 생성자가 있으므로 std::string으로 바뀝니다. 그 std::string은 익명의 개체가 될 것이며 임시적이며 참조를 반환합니다.

4

Shaggy Frog과 마찬가지로 ""을 임시 std :: string 객체로 변환하고 메서드 서명이 std :: string &이므로 경고를받습니다. 하나의 해결 방법은 값으로 std :: string을 반환하는 것입니다 (const std :: string SomeClass :: Foo (..)).

6

이것은 C++에서 코드를 최적화하려고 시도한 예입니다. 나는 그것을했다, 모두는 그것을했다. ... 이것은 값 최적화를 반환 할 수있는 고전적인 예라고 언급 할 가치가있다.

ttvd와 마찬가지로 정답은 const std :: string이 아니라 참조를 반환하고 컴파일러가 최적화하도록하는 것입니다.

내가 선호하는 언어의 통역자가 당신보다 뒤떨어져 있다고 믿는다면, C + +로 너무 똑똑하지 않도록 노력해야합니다.

0

피할 수있는 다른 방법은 정적으로 반환하려는 것을 선언하고 참조로 반환을 사용하는 것입니다.