2013-07-22 1 views
3

나는 내가 다음 하나에 매우 similary 코드 본 일 : 나는 원래의 코드를 재현 할 수없는 분명한 이유임시 객체 유형과 생활 시간 프로젝트에서

std::string str = (std::string() += "some string") += "some other string"; 

을,하지만 난 그것을 정의 String를 사용하여 말할 수있다 operator<<std::string의 경우 operator+=과 동일한 동작을합니다.

불필요한 임시 개체의 생성/제거 옆에 무언가가 매우 잘못되었다고 느낍니다. 그러나 정확히 무엇이 모르는 지요.

임시 개체는 const입니까? 그렇습니다. operator +=이 개체를 변형시키기 때문에이 코드가 어떻게 컴파일됩니까 (VS2010)? 여기에 문제가 무엇인지 설명해 주시겠습니까?

+2

이것은 "연산자 +"문자열과 연관된 "초과"임시 객체를 방지하려는 잘못된 시도처럼 보입니다. – John

+2

여기서 가장 중요한 점은 매우 추악하고, 독립적이며, 직관적이지 않은 코드라는 것입니다. –

답변

2

임시 개체는 const이 아닙니다. 그들은 rvalues입니다. 이는 const 참조 (C++ 03) 또는 (const 또는 non-const) rvalue 참조 (C++ 11)에 바인딩 할 수 있음을 의미합니다.

또한 임시 직원이 아닌 const 멤버 함수를 ( 멤버 연산자 포함) 호출 할 수 있습니다. 이것은 아마도이 경우에 일어나는 일일 것입니다. 비 const 멤버 연산자를 호출하면 매달린 참조가 누출 될 수 있으므로 위험합니다. 그러나이 경우 표현 외부에 지속되는 참조가 없으므로 괜찮습니다. 에서

C++ (11) 우리를 rvalue 참조를, 그래서 표현이 더 명확하게 재 작성 될 수보다 안전하게 등 :

있는 임시 string의 내용은 이동 생성자를 통해 무료 operator+에 의해 재사용
std::string str = std::string() + "some string" + "some other string"; 

; 임시 거주자는 이동 된 상태에서 유지됩니다.

2
(std::string() += "some string") += "some other string"; 

temp1(std::string()); 
temp1 += "some string" 
temp1 += "some other string"; 

괄호 모두 + = 연산을 통해 우선 순위를 정의로 파산 할 수있다. 범위를 정의하지 않으므로 temp1은이 명령문을 실행할 때 어떤 수단으로도 파괴되지 않습니다.

C++ 표준은 두 문자열 리터럴 모두 프로그램의 수명을 보장합니다.

따라서이 코드 샘플에는 최소한의 양의 임시 개체가 있습니다. 그것은

std:string str = ((((((std::string() += "a") += "b") += "c") += "d") += "e") += "f"); 
+0

샘플에는 임시 개체가 하나 있습니다. 이것은 이동 의미를 고려할 때, 큰 오버 헤드가 아닙니다 ... – Felics

+0

그렇습니다. 이 줄에는 하나의 임시 오브젝트 만 생성됩니다. 체인 연결의 정도는 중요하지 않습니다. – UmNyobe

1

가 수명 포인트가 명확하게하기 위해 리터럴의 임의의 금액을 갈 수

은 표준 (12.2) 말합니다 :

임시 객체가 평가의 마지막 단계에서 파괴된다 그것들이 생성 된 지점을 (어휘 적으로) 포함하는 완전한 표현 (1.9).

및 (1.9)

전체 표현식이 다른 표현식의 표현식없는 표현이다.

이 경우 이것은 (내 최고의 지식) (std::string() += "some string") += "some other string"와 (당신이 기술적으로 = 초기화와 함께 할) std::string의 이동 생성자를 호출 할 것이다. 간단히 말하자면 임시의 수명은 ;으로 끝납니다. 즉, 여기에서 안전하다는 의미입니다.

관련 문제