2013-07-26 5 views
2

는 리턴 값에 의한 ++ (11) 이동 생성자가 존재 C에 대한 복사 ctor에 필요한가 ++? GCC 4.7.1은 move 생성자 만 가지고 있기 때문에 copy-ctor가 함축적으로 삭제되었다고 불평하지만이 경우에는 move 생성자를 사용해야한다고 생각합니다.복사 ctor에 11

VeryLargeObject foo(...) 
    { 
    VeryLargeObject ret; 
    //Built object 
    return ret; //<Error: VeryLargeObject has deleted copy-constructor 
    } 

정말 필요할 때까지 복사 생성자를 추가하고 싶지 않습니다.

편집 :. 내가 이동 생성자를 잊어 버린 것을 발견

죄송합니다 ... 난 단지 아니, 당신은이 상황에서 이동 생성자를 요구해야

+0

는 그것은 이동,하지만 난 복사 생성자는 여전히 사용할 수 있어야합니다 생각 될 _can_. 컴파일러가이를 사용하기로 결정한 경우입니다. –

+0

필자가 이해하는 한, 컴파일러는 RVO를 사용하거나 객체를 옮기는 것을 허용하지 않습니다. RVO와 이동이 불가능한 경우가 아니면 복사본을 만들지 않습니다. 그러나 비록 그것들이 * 최적화 된 * 최적화를 사용할 수는 있지만 결국은 복사 의미론이므로 복사 생성자가 필요하지 않습니다. 복사 생성자가 삭제되면'std :: move'를 사용하여 이동을 시행하십시오. – syam

+0

12.8에서이 규칙을 빨리 찾으려고했지만 시간이 많이 걸렸습니다. 만약 당신이 그것을 분석하는 데 귀찮은 수 있습니다 12.8/31있을 수 있습니다. 또는 아마도 12.2, 이는'return'을 위해 (그리고 아마도 생략 된) 일시적으로 만들어지는 것에 대해 말하고 있습니다. –

답변

3

:-(할당을 이동했다 어느 코드 버그가 있습니다 (아마도 이동 생성자가 표시되지 않았거나 실제로 추가하지 않았거나 GCC 버그입니다). 게시물 편집을 기반으로 한 것 같습니다. 아마도 이전이었을 것입니다.

복사 생성자 은 로컬 변수가 아닌 다른 L 값을 반환하려고 할 때 필요합니다. L 값을 move()을 사용하여 R 값으로 변환하여 작동하게 할 수 있습니다 (물론 L 값의 상태를 변경하게 될 것임을 알고 있음).