클래스에 대한 이동 시맨틱 구현에 꽤 많은 시간을 할애했지만, 이제는 그것을 사용하는 함수를 다루고 있습니다.시맨틱과 const 레퍼런스 이동하기
좋아요, 그래서이 개체에는 힙에 많은 데이터가 있습니다 : CLargeOb
에 대해 이동 구문 (생성자 및 연산자 =)을 구현했습니다. 이 객체가 휴지통/이동 될 수 있도록하는 것이 항상 가능한 것은 아니다 그러나
void OtherOb::Func(CLargeOb&& largeOb1, CLargeOb&& largeOb2)
{
SomeOtherFunc(largeOb1); // use objects
SomeOtherFunc(largeOb2);
m_largeOb1 = (CLargeOb&&)largeOb1; // save as members and trash the originals
m_largeOb2 = (CLargeOb&&)largeOb2;
}
, 그래서 나는이 두 가지 기능을 추가 : 그것은 이상적으로 다음과 같이 사용된다 당신이 이미 수, 작동하지만
void OtherOb::Func(const CLargeOb& largeOb1, CLargeOb&& largeOb2)
{
SomeOtherFunc(largeOb1);
SomeOtherFunc(largeOb2);
m_largeOb1 = largeOb1;
m_largeOb2 = (CLargeOb&&)largeOb2;
}
void OtherOb::Func(CLargeOb&& largeOb1, const CLargeOb& largeOb2)
{
SomeOtherFunc(largeOb1);
SomeOtherFunc(largeOb2);
m_largeOb1 = (CLargeOb&&)largeOb1;
m_largeOb2 = largeOb2;
}
을 이 객체를 매개 변수로 3 개 이상 사용하는 함수가있을 때 * ss에서 큰 고통이 될 것 같아요 ... 템플릿을 사용하거나 '완벽한 전달'을 사용하여이를 해결하는 영리한 방법이 아닌가요?
@MooingDuck : VS2010에서 문제없이 작동합니다. 연산자 = (&&)를 호출하려면 std :: move 또는 && cast를 사용하여 명시 적으로 호출해야합니다. 그러나 솔루션은 물론 그 아래 훨씬 더 물론 제공했다. – demorge
@demorge : 오 맞아요. 이름이 지어지면 규칙이 변경된다는 것을 완전히 잊어 버렸습니다. 죄송합니다 –
'(CLargeOb &&) largeOb1' 대신'std :: move (largeOb1)'을 써주십시오. 프로그래머 세대는 비 관용적이고 경계선을 읽을 수없는 C/C++ 믹스 대신 표준 C++ 11 이동 방법을 사용해 주셔서 감사합니다. – fredoverflow