> 백엔드 개발 > C++ > `std::unique_ptr`을 반환하는 데 `std::move()`가 필요하지 않은 이유는 무엇입니까?

`std::unique_ptr`을 반환하는 데 `std::move()`가 필요하지 않은 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2024-12-22 18:03:10
원래의
417명이 탐색했습니다.

Why Does Returning a `std::unique_ptr` Not Require `std::move()`?

std::move() 없이 std::unique_ptr을 반환하는 이유는 무엇입니까?

std::unique_ptr 복사 구성을 방지하고 대신 이동 의미를 사용합니다. 그러나 Unique_ptr std::move()를 명시적으로 사용하지 않고 함수에서.

다음 코드 조각을 고려하세요.

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에서는 복사 제거에 대해 설명합니다.

특정 기준이 충족되면 구현 시 클래스 객체 [...]의 복사/이동 구성을 생략할 수 있습니다.

이 경우 복사 제거가 허용되는 이유는 다음과 같습니다.

  • 반환 값은 임시입니다. object.
  • 임시 개체는 함수 반환 형식과 동일한 형식입니다.
복사 작업 제거 기준을 만족하고 복사할 개체를 다음으로 지정한 경우 복사본의 생성자를 선택하기 위한 lvalue, 오버로드 확인은 객체가 rvalue로 지정된 것처럼 먼저 수행됩니다.

이는 반환 값이 명명된 객체임에도 불구하고 이를 의미합니다. (lvalue), 과부하 해결에서는 이를 여전히 rvalue로 간주합니다. 따라서 이동 생성자는 호출되지 않으며 반환된 Unique_ptr은 성공적으로 생성됩니다.

결론

std::move() 없이 Unique_ptr을 반환하는 기능은 C의 미묘한 기능입니다. 언어 사양. 복사 제거 조건이 충족되는 한 함수에서 고유_ptr을 반환할 때 std::move()를 명시적으로 사용할 필요는 없습니다. 이를 통해 코드 명확성을 높이고 불필요한 이동 작업을 줄이는 데 도움이 됩니다.

위 내용은 `std::unique_ptr`을 반환하는 데 `std::move()`가 필요하지 않은 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿