std::unique_ptr
다음 코드 조각을 고려하세요.
unique_ptr<int> foo() { unique_ptr<int> p(new int(10)); return p; // Line 1 } int main() { unique_ptr<int> p = foo(); cout << *p << endl; }
라인 1은 std::move() 없이 Unique_ptr을 반환합니다. 놀랍게도 코드가 의도한 대로 컴파일되고 작동하는데 복사 생성자를 호출하지 않고 이것이 어떻게 가능합니까?
이 동작을 이해하는 열쇠는 C 언어 사양에 있습니다. 특히 섹션 12.8 §34 및 §35에서는 복사 제거에 대해 설명합니다.
특정 기준이 충족되면 구현 시 클래스 객체 [...]의 복사/이동 구성을 생략할 수 있습니다.
이 경우 복사 제거가 허용되는 이유는 다음과 같습니다.
복사 작업 제거 기준을 만족하고 복사할 개체를 다음으로 지정한 경우 복사본의 생성자를 선택하기 위한 lvalue, 오버로드 확인은 객체가 rvalue로 지정된 것처럼 먼저 수행됩니다.
이는 반환 값이 명명된 객체임에도 불구하고 이를 의미합니다. (lvalue), 과부하 해결에서는 이를 여전히 rvalue로 간주합니다. 따라서 이동 생성자는 호출되지 않으며 반환된 Unique_ptr은 성공적으로 생성됩니다.
std::move() 없이 Unique_ptr을 반환하는 기능은 C의 미묘한 기능입니다. 언어 사양. 복사 제거 조건이 충족되는 한 함수에서 고유_ptr을 반환할 때 std::move()를 명시적으로 사용할 필요는 없습니다. 이를 통해 코드 명확성을 높이고 불필요한 이동 작업을 줄이는 데 도움이 됩니다.
위 내용은 `std::unique_ptr`을 반환하는 데 `std::move()`가 필요하지 않은 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!