2014-05-11 4 views
-1

다음 예제에서는 'fun'의 'src'인수가 명시 적으로 rvalue 참조이고 이동 생성자가 재미있는 'copy'구성에서 호출되지 않습니다. 그 건설에만 사용 되었습니까?이동 생성자가 호출되지 않습니다? (C++ 11)

struct Toy { 
    int data; 

    Toy(): data(0) 
    { 
     log("Constructed"); 
    } 

    Toy(Toy const& src): data(src.data) 
    { 
     log("Copy-constructed"); 
    } 

    Toy(Toy&& src): data(src.data) 
    { 
     log("Move-constructed"); 
    } 
}; 

Toy fun(Toy&& src) 
{ 
    Toy copy(src); 
    copy.data = 777; 
    return copy; 
} 

Toy toy(fun(Toy())); // LOG: Constructed Copy-constructed 
+1

가능한 복제본 [복제 추출 및 반환 값 최적화 란 무엇입니까?] (http://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization) – nosid

+1

당신의 예는 완전하거나 쓸모가 없으며, 다음 번엔 다른 사람들이 사용할 수있는 무언가를 게시하십시오. 잠재 고객으로부터 문제를 복제하는 것으로 보이는 임의의 미리보기가 아닙니다. – user2485710

+0

복사 elision 또는 반환 값 최적화가 'copy'객체가 함수 내부에서 생성되는 방식과 아무런 관련이 없음을 이해하지 못합니다. 일어나는 일은 분명히 반 직관적이고 역효과가 있습니다. – user3026691

답변

0

Bob && b은 rvalue reference이지만, 건설 후 데이터의 모든 명명 된 사용은 lvalue로 사용됩니다.

그래서 Bob&& b은 값으로 만 바인딩되지만 사용하면 이 아닌으로 이동합니다. 를 rvalue 참조를 얻을 수

유일한 방법은 다음과 같습니다

  • 이러한 캐스트의 임시 반환 값이나 결과로 이름이없는 값.

  • 간단한 return x; 문에서 로컬 값 변수를 사용합니다.

  • std::move 또는 std::forward 등의 값으로 명시 적으로 캐스팅합니다.

이렇게하면 데이터가 한 줄에서 자동으로 이동 된 후 다음 번에 사용되지 않습니다. 그것은 rvalue를 '프로그래머가이 표현 이후에'필요로하지 않는다고 말하고, '나중에 필요하지 않은 것들만 함수 매개 변수에서 가져 오는 것'이라고 생각하는 데 도움이 될 수 있습니다. 위의 임시/반환 예외는 컴파일러가 비교적 안전하게이 자체를 보장 할 수있는 두 지점입니다.

마지막으로 범용 참조 (auto&&T&&)는 rvalue 참조처럼 보이지만 때로는 그렇지 않습니다.

+0

나는 꽤 이해하지 못한다 ... 재미있게 전달 된 Toy()는 이름이없는 값이고, 재미는 그것을 "나중에 필요하지 않은 것"으로 인식하며, 실제로는 사용하지 않는다. 다른 객체를 생성하십시오. 그렇다면 왜 컴파일러가 이동을 수행 할 수 없습니까? – user3026691

+0

@ user3026691 이름이 'src' 인 메소드에서 - 사용중인 lvalue입니다. 그것은 rvalue로 캐스팅되지 않으며'return x; '에서 사용되는 로컬 값도 아니므로 사용 지점에서 lvalue 인 경우가 분명합니다. 컴파일러는 'lvalue'라고하는 C++ 11 규칙을 따릅니다. 수정하려면'std :: move'. 나는 C++ 11이 왜이 문제에서 'lvalue'라고 말하는지에 대해 논의하지 않을 것입니다. 왜냐하면 그것은 당신의 문제와 무관하기 때문입니다. – Yakk

관련 문제