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입니다. 나는 여기서 혼란스러워. 나는 바보 같은 것을 놓치고 있다고 생각한다.
관련 없음 : 'foo' 함수가 복사 또는 이동하려고하는 경우, 값으로 인수를 취하여 컴파일러가 복사 또는 이동하도록 할 수 있습니다. –
첫 번째 예제에 대한주의 :'std :: move (get_string())'은 임시 표현식이 아니다. 임시 표현식은'get_string()'이지만, 당신은 그것을 캐스트합니다. 따라서 참조에 바인딩하는 임시 표현식에 대한 규칙이 더 이상 적용되지 않습니다. –