std::unique_ptr
Std::unique_ptr
Visual Studio 2010 SP1의 구현 종속 동작
Visual Studio 2010 SP1의 동작은 다음과 같습니다. std::unique_ptr의 구현에는 Thing의 완전한 정의가 필요합니다. 이는 표준 요구사항이 아니라 구현별 선택입니다.
표준 라이브러리의 부분 예외
대부분의 C 표준 라이브러리 템플릿에는 완전한 유형이 필요하지만, std ::shared_ptr 및 std::unique_ptr은 부분적인 예외입니다. 일부 기능은 구현 포인터(pimpl) 패턴과 같은 관용어를 지원하는 역할로 인해 불완전한 유형으로 인스턴스화될 수 있습니다. 그러나 특정 작업에서 불완전한 유형을 사용하면 불완전한 객체 삭제와 같은 정의되지 않은 동작이 발생할 수 있습니다.
다른 작업에 대한 유형 완전성 요구 사항
std::unique_ptr 및 std::shared_ptr에는 다양한 상황에서 완전한 유형이 필요합니다. 예를 들어 ~std::unique_ptr에는 소멸자에 대한 완전한 유형이 필요한 반면, std::unique_ptr(A*)는 포인터가 인수되는 경우 불완전한 유형을 허용합니다. 표에 이러한 요구 사항이 요약되어 있습니다.
Operation | std::unique_ptr | std::shared_ptr |
---|---|---|
Default constructor | incomplete | incomplete |
Copy constructor | - | incomplete |
Move constructor | incomplete | incomplete |
Destructor | complete | incomplete |
Constructor from pointer | incomplete | complete |
Copy assignment | - | incomplete |
Move assignment | complete | incomplete |
Reset without argument | complete | incomplete |
Reset with argument | complete | complete |
결론적으로 std::unique_ptr은 본질적으로 C 표준에서 완전한 형식 정의를 요구하지 않지만 일부 구현(예: Visual Studio 2010 SP1)에서는 이러한 요구 사항을 부과할 수 있습니다. . 정의되지 않은 동작을 방지하려면 사용되는 구현의 특정 요구 사항을 알고 있는 것이 중요합니다.
위 내용은 `std::unique_ptr`에는 T에 대한 완전한 정의가 필요합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!