2012-11-27 2 views
9

According to another answer, rvalue 참조는 임시 참조의 표현식이 xvalue 표현식이면 임시의 유효 기간을 연장하지 않습니다. 괜찮rvalue 참조가있는 임시 수명의 연장

int main() 
{ 
    std::string&& danger = std::move(get_string()); // dangling reference ! 
    return 0; 
} 

: std::move이를 rvalue 참조를 반환하기 때문에, 호출의 발현은가 xValue 및 그래서 매달려 참조에서 다음과 같은 결과이다. std::move은 여기서 의미가 없습니다. 그것은 이미 가치입니다.

하지만 여기서 나는 공백을 그리는 곳입니다. xvalue 표현식을 인수로 전달하는 것과 다른 점은 무엇입니까? std::move과 rvalue 참조를 완전히 표준으로 사용합니까?

void foo(const std::string& val); 
// More efficient foo for temporaries: 
void foo(std::string&& val); 

int main() 
{ 
    std::string s; 
    foo(std::move(s)); // Give up s for efficiency 
    return 0; 
} 

임시의 수명을 연장 할를 rvalue 참조 인수에 대한 특별한 규칙에 관계없이이 prvalue 또는가 xValue 여부가 있습니까? 아니면호출 식은 xvalue라는 값입니다. 왜냐하면 우리는 이미 rvalue 인 값을 전달했기 때문입니까? 어쨌든 rvalue 참조를 반환하기 때문에 나는 그렇게 생각하지 않습니다. 이것은 xvalue입니다. 나는 여기서 혼란스러워. 나는 바보 같은 것을 놓치고 있다고 생각한다.

+0

관련 없음 : 'foo' 함수가 복사 또는 이동하려고하는 경우, 값으로 인수를 취하여 컴파일러가 복사 또는 이동하도록 할 수 있습니다. –

+0

첫 번째 예제에 대한주의 :'std :: move (get_string())'은 임시 표현식이 아니다. 임시 표현식은'get_string()'이지만, 당신은 그것을 캐스트합니다. 따라서 참조에 바인딩하는 임시 표현식에 대한 규칙이 더 이상 적용되지 않습니다. –

답변

7

여기서 수명을 연장 할 필요는 없습니다. 문제의 오브젝트는 foo의 끝 부분 인 main의 끝까지 지속됩니다.

+0

사실 ... 주어진 코드에는 임시 테이블이 없습니다. – Mankarse

+4

오 마이 갓. 나는 잠이 필요해. –

8

두 번째 예는 임시 참조를 전달하지 않고 s 변수에 대한 참조를 전달하며 이는 main()의 끝까지 유지됩니다.

(예 : foo(std::move(get_string()));)이면 임시 반환 값은 함수가 반환 된 후 전체 표현식이 끝날 때까지 지속됩니다. 따라서 foo 이내에 사용하는 것이 안전합니다. foo이 인수에 대한 참조/포인터를 저장하고 나중에 다른 것을 사용하려고하면 위험 할 수 있습니다.

+1

그러나 rvalues의 주소를 가져 오는 것은 불법입니다. – user1095108

+4

@ user1095108하지만'val'은'foo (std :: string && val)'함수 본문의 rvalue가 아닙니다. 이것은 "rvalue reference"타입의 lvalue입니다. 's'의 수명이 끝날 때까지 주소를 사용하고 주소를 사용하는 것은 합법적입니다. – Oktalist