함수가 종료 된 후 참조 된 개체가 범위를 벗어나지 않을 것이라고 확신하는 경우 참조로 반환 할 수 있습니다 (예 : 전역 개체의 참조 또는 클래스 필드에 대한 참조를 반환하는 멤버 함수 등).
이 반환 참조 규칙은 lvalue 및 rvalue 참조와 동일합니다. 차이점은 반환 된 참조를 사용하는 방법입니다. 내가 볼 수 있듯이 rvalue 참조로 반환하는 것은 드뭅니다. 기능이있는 경우 :
Type&& func();
이러한 코드가 마음에 들지 않습니다.
Type&& ref_a = func();
명명 된 rvalue 참조가 lvalue이기 때문에 ref_a를 Type &로 효과적으로 정의하기 때문에 여기에서는 실제 이동이 수행되지 않습니다. 다음과 같습니다.
const Type& ref_a = func();
실제 ref_a가 상수가 아닌 lvalue 참조라는 점을 제외하고.
또한 Type && 인수를받는 다른 함수에 func ()를 직접 전달하는 경우에도 그 함수 내에서 명명 된 참조이므로 유용하지 않습니다.
void anotherFunc(Type&& t) {
}
anotherFunc(func());
func () 및 anotherFunc ()의 관계는 func ()가 anotherFunc ()가 func ()에서 반환 된 객체의 소유권을 가질 수 있다는 데 동의하는 "권한 부여"와 비슷합니다. 그러나이 합의는 매우 느슨합니다. 상수가 아닌 lvalue 참조는 호출자가 여전히 "도용"할 수 있습니다. 실제로 함수는 rvalue 참조 인수를 사용하도록 정의되지 않습니다. 가장 일반적인 경우는 "anotherFunc"가 클래스 이름이고 anotherFunc ()는 실제로 이동 생성자입니다.