std::move: 없이 std::unique_ptr을 반환하는 것이 어떻게 가능합니까?
std::에서 복사 구성이 금지되어 있음에도 불구하고: Unique_ptr
예외: 복사 제거
C에서는 다음에 정의된 대로 특정 상황에서 복사 제거를 허용합니다. 12.8 §34 및 §35. 그러한 경우 중 하나는 함수의 반환 유형과 동일한 cv-unqualified 유형을 가진 비휘발성 자동 객체가 반환되는 경우입니다. 이 시나리오에서는 컴파일러가 복사본 생성 프로세스를 생략할 수 있습니다. 이 제거는 복사와 이동 모두에 적용됩니다.
복사 제거 구현
복사 제거가 return 문에 사용되면 컴파일러는 먼저 개체를 다음과 같이 간주합니다. 오버로드 해결을 위해 rvalue(lvalue이더라도). 결과적으로 이동 생성자를 사용할 수 있으면 선택되지만 실제 이동 작업은 수행되지 않습니다. 그 결과 자리 표시자 역할을 하고 고유 포인터의 소유권 의미 체계를 유지하는 빈 이동 생성자 호출이 발생합니다.
예
다음 코드는 현상을 보여줍니다.
unique_ptr<int> foo() { unique_ptr<int> p( new int(10) ); return p; // Line 1, copy elision applied } int main() { unique_ptr<int> p = foo(); cout << *p << endl; return 0; }
1번째 줄에서 반환된 Unique_ptr
결론
복사 생성자 금지에 대한 이 예외는 효율적이고 간결한 반환 문을 용이하게 하기 위해 C 언어 사양에서 특별히 허용됩니다. 그러나 복사 제거는 컴파일러가 수행할 수도 있고 수행하지 않을 수도 있는 최적화라는 점에 유의하는 것이 중요합니다. 따라서 일반적으로 의도한 동작을 보장하기 위해 return 문에서 std::move를 명시적으로 사용하는 것이 좋습니다.
위 내용은 `std::move`를 사용하지 않고 `std::unique_ptr`을 어떻게 반환할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!