답변:
Beta_ab&&
Beta::toAB() const {
return move(Beta_ab(1, 1));
}
이것은 lvalue 참조 사례와 마찬가지로 매달려있는 참조를 반환합니다. 함수가 반환되면 임시 객체가 소멸됩니다. Beta_ab
다음과 같이 값으로 반환해야합니다.
Beta_ab
Beta::toAB() const {
return Beta_ab(1, 1);
}
이제 임시 Beta_ab
객체를 함수의 반환 값 으로 올바르게 이동 합니다. 컴파일러가 RVO (반환 값 최적화)를 사용하여 이동을 완전히 피할 수 있습니다. 이제 다음을 할 수 있습니다
Beta_ab ab = others.toAB();
그리고 임시로 ab
를 구성하거나 RVO를 수행하여 이동 또는 복사를 생략합니다. 문제와 (N) RVO가 어떻게 상호 작용하는지 설명하는 BoostCon09 Rvalue References 101 을 읽으 십시오 .
다른 경우에는 rvalue 참조를 반환하는 것이 좋습니다. getAB()
일시적으로 자주 호출 하는 기능이 있다고 상상해보십시오 . rvalue 임시에 대한 const lvalue 참조를 리턴하는 것은 최적이 아닙니다. 이처럼 구현할 수 있습니다
struct Beta {
Beta_ab ab;
Beta_ab const& getAB() const& { return ab; }
Beta_ab && getAB() && { return move(ab); }
};
참고 것을 move
때문에이 경우, 선택하지 ab
로컬 자동이나 일시적인를 rvalue도 아니다. 이제 참조 한정자 &&
는 rvalue 임시에서 두 번째 함수가 호출되어 복사 대신 다음과 같이 이동한다고 말합니다.
Beta_ab ab = Beta().getAB();
그것은 수 있습니다 약간 다른 맥락에서, 예를 들어, 더 효율적일 수 :
template <typename T>
T&& min_(T&& a, T &&b) {
return std::move(a < b? a: b);
}
int main() {
const std::string s = min_(std::string("A"), std::string("B"));
fprintf(stderr, "min: %s\n", s.c_str());
return 0;
}
흥미로운 관찰로, 내 컴퓨터에서 clang++ -O3
위의 코드에 대한 54 개의 명령어와 regular에 대한 62 개의 명령어를 생성 std::min
합니다. 그러나 -O0
이를 사용하면 위의 코드에 대해 518 개의 명령어를 생성하고 regular에 대해서는 481 명령을 생성 std::min
합니다.
for(:)
할당 해제 된 개체에 대한 임시 개체 와 통합 에 대한 참조를 사용했습니다 . 수정 : ideone.com/tQVOal
std::move()
요점을보다 명확하게 설명하기 위해 명시 적 캐스트로 사용됩니다. 프로젝트에 복사하여 붙여 넣을 코드는 아닙니다. 함수 내에 임시 개체가 만들어지기 때문에 최상위 투표 답변과 모순되지 않습니다. 여기에서 반환 된 객체는 인수 중 하나입니다 (임시 객체는 생성 된 지점을 포함하는 전체 표현을 평가하는 마지막 단계로 소멸됨).