간단한 대답은 정규 참조 코드와 마찬가지로 rvalue 참조 코드를 작성해야하며 정신적으로 99 %의 시간을 동일하게 취급해야한다는 것입니다. 여기에는 참조 반환에 대한 모든 이전 규칙이 포함됩니다 (즉, 로컬 변수에 대한 참조는 절대 반환하지 않습니다).
std :: forward를 활용하고 lvalue 또는 rvalue 참조를 사용하는 일반 함수를 작성할 수있는 템플리트 컨테이너 클래스를 작성하지 않는 한, 이것은 거의 사실입니다.
이동 생성자 및 이동 할당의 가장 큰 장점 중 하나는이를 정의하면 RVO (반환 값 최적화) 및 NRVO (명명 된 반환 값 최적화)가 호출되지 않은 경우 컴파일러에서이를 사용할 수 있다는 것입니다. 컨테이너 및 문자열과 같은 고가의 객체를 메소드에서 효율적으로 값으로 반환하는 데는 상당히 큰 것입니다.
rvalue 참조로 흥미로운 점은 일반적인 함수의 인수로 사용할 수도 있다는 것입니다. 이를 통해 const 참조 (const foo & other) 및 rvalue reference (foo && other) 모두에 대한 과부하가있는 컨테이너를 작성할 수 있습니다. 단순한 생성자 호출로 전달하기에 인수가 다루기 어려울지라도 여전히 수행 할 수 있습니다.
std::vector vec;
for(int x=0; x<10; ++x)
{
// automatically uses rvalue reference constructor if available
// because MyCheapType is an unamed temporary variable
vec.push_back(MyCheapType(0.f));
}
std::vector vec;
for(int x=0; x<10; ++x)
{
MyExpensiveType temp(1.0, 3.0);
temp.initSomeOtherFields(malloc(5000));
// old way, passed via const reference, expensive copy
vec.push_back(temp);
// new way, passed via rvalue reference, cheap move
// just don't use temp again, not difficult in a loop like this though . . .
vec.push_back(std::move(temp));
}
STL 컨테이너는 거의 모든 것 (해시 키 및 값, 벡터 삽입 등)에 대한 이동 과부하를 갖도록 업데이트되었으며 가장 많이 볼 수있는 곳입니다.
일반 함수에도 사용할 수 있으며, rvalue 참조 인수 만 제공하면 호출자가 객체를 작성하고 함수가 이동하도록 강제 할 수 있습니다. 이것은 실제로 사용하는 것보다 더 좋은 예이지만 렌더링 라이브러리에서로드 된 모든 리소스에 문자열을 할당하여 디버거에서 각 객체가 나타내는 것을 쉽게 볼 수 있습니다. 인터페이스는 다음과 같습니다.
TextureHandle CreateTexture(int width, int height, ETextureFormat fmt, string&& friendlyName)
{
std::unique_ptr<TextureObject> tex = D3DCreateTexture(width, height, fmt);
tex->friendlyName = std::move(friendlyName);
return tex;
}
그것은 '누수 추상화'의 한 형태이지만, 이미 대부분의 시간에 문자열을 만들어야한다는 사실을 이용하고 또 다른 복사를 피할 수 있습니다. 이것은 정확히 고성능 코드는 아니지만 사람들 이이 기능을 사용하지 못할 가능성의 좋은 예입니다. 이 코드는 실제로 변수가 호출의 임시 변수이거나 std :: move 호출 된 변수 여야합니다.
// move from temporary
TextureHandle htex = CreateTexture(128, 128, A8R8G8B8, string("Checkerboard"));
또는
// explicit move (not going to use the variable 'str' after the create call)
string str("Checkerboard");
TextureHandle htex = CreateTexture(128, 128, A8R8G8B8, std::move(str));
또는
// explicitly make a copy and pass the temporary of the copy down
// since we need to use str again for some reason
string str("Checkerboard");
TextureHandle htex = CreateTexture(128, 128, A8R8G8B8, string(str));
그러나 이것은 컴파일되지 않습니다!
string str("Checkerboard");
TextureHandle htex = CreateTexture(128, 128, A8R8G8B8, str);