>백엔드 개발 >C++ >C에서 `std::move` 없이 `std::unique_ptr`을 반환할 수 있나요?

C에서 `std::move` 없이 `std::unique_ptr`을 반환할 수 있나요?

Susan Sarandon
Susan Sarandon원래의
2024-12-15 02:42:09470검색

Can I Return a `std::unique_ptr` Without `std::move` in C  ?

std::move 없이 std::unique_ptr 반환

C에서 std::unique_ptr은 객체의 다중 소유권을 방지하기 위해 이동 의미 체계를 적용합니다. 그러나 std::move를 호출하지 않고 함수에서 Unique_ptr을 반환하는 것이 가능합니다. 이 동작은 복사 제거라는 언어 기능으로 인해 발생할 수 있습니다.

복사 제거

C 언어 사양(12.8 §34 및 §35)에 따라 구현은 생략(생략)이 허용됩니다. ) 특정 기준이 충족되면 작업을 복사/이동합니다. 특히, 표현식이 함수 반환 유형과 동일한 cv-unqualified 유형을 가진 비휘발성 자동 객체의 이름인 경우 클래스 반환 유형에 대한 return 문에서 복사 제거가 허용됩니다.

Elision in Unique_ptr 반환 문

제공한 예제 코드에서:

unique_ptr<int> foo()
{
  unique_ptr<int> p(new int(10));
  return p;  // Line 1
}

p는 비휘발성 자동 개체입니다. 함수 반환 유형인 Unique_ptr와 동일한 유형을 갖습니다. 따라서 컴파일러는 p의 복사 생성을 생략할 수 있습니다.

컴파일러는 라인 1을 만나면 먼저 오버로드 확인을 수행하여 마치 p가 rvalue로 지정된 것처럼 복사 작업을 위한 생성자를 선택합니다. 그러나 제거 기준이 충족되므로 복사 구성이 제거되고 반환된 값은 이동된 고유_ptr이 됩니다.

모범 사례에 대한 의미

값으로 반환한다는 점에 유의하는 것이 중요합니다. 이 시나리오에서는 기본 선택이 되어야 합니다. 복사 제거가 있는 경우 return 문의 명명된 값은 rvalue로 처리됩니다. 즉, std::move를 명시적으로 사용하지 않고도 반환된 고유_ptr을 함수의 임시 개체에서 이동할 수 있습니다.

참조로 반환하거나 std::make_unique를 사용하는 것은 모두 복사 제거를 피하고 명시적 보장을 위한 실행 가능한 대안입니다. 소유권 이전.

위 내용은 C에서 `std::move` 없이 `std::unique_ptr`을 반환할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.