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
}
정말 필요할 때까지 복사 생성자를 추가하고 싶지 않습니다.
편집 :. 내가 이동 생성자를 잊어 버린 것을 발견
죄송합니다 ... 난 단지 아니, 당신은이 상황에서 이동 생성자를 요구해야
는 그것은 이동,하지만 난 복사 생성자는 여전히 사용할 수 있어야합니다 생각 될 _can_. 컴파일러가이를 사용하기로 결정한 경우입니다. –
필자가 이해하는 한, 컴파일러는 RVO를 사용하거나 객체를 옮기는 것을 허용하지 않습니다. RVO와 이동이 불가능한 경우가 아니면 복사본을 만들지 않습니다. 그러나 비록 그것들이 * 최적화 된 * 최적화를 사용할 수는 있지만 결국은 복사 의미론이므로 복사 생성자가 필요하지 않습니다. 복사 생성자가 삭제되면'std :: move'를 사용하여 이동을 시행하십시오. – syam
12.8에서이 규칙을 빨리 찾으려고했지만 시간이 많이 걸렸습니다. 만약 당신이 그것을 분석하는 데 귀찮은 수 있습니다 12.8/31있을 수 있습니다. 또는 아마도 12.2, 이는'return'을 위해 (그리고 아마도 생략 된) 일시적으로 만들어지는 것에 대해 말하고 있습니다. –