>백엔드 개발 >C++ >Pimpl 관용구에서 `std::unique_ptr`이 불완전한 유형으로 인해 실패하는 이유는 무엇입니까?

Pimpl 관용구에서 `std::unique_ptr`이 불완전한 유형으로 인해 실패하는 이유는 무엇입니까?

DDD
DDD원래의
2024-12-13 05:01:11456검색

Why Does `std::unique_ptr` Fail with Incomplete Types in Pimpl Idiom?

std::unique_ptr 및 Incomplete Types: A Deeper Look

std::unique_ptr:

class window {
  window(const rectangle& rect);

private:
  class window_impl; // defined elsewhere
  std::unique_ptr<window_impl> impl_; // won't compile
};
단, 컴파일 오류가 발생하는 이유는 다음과 같습니다. 불완전한 유형:

"불완전한 유형 'uixx::window::window_impl'에 'sizeof'를 잘못 적용했습니다."
전통적으로 std::unique_ptr은 불완전한 유형과 호환됩니다. 그렇다면 문제는 어디에 있습니까?

문제의 핵심: 파괴

핵심은 파괴에 있습니다. pimpl을 Unique_ptr과 함께 사용하는 경우 소멸자를 명시적으로 선언해야 합니다.

class foo {
    class impl;
    std::unique_ptr<impl> impl_;

public:
    foo(); // Constructor may need external definition

    ~foo(); // Implement (braceless or with = default;) once impl is complete
};
그렇지 않은 경우 컴파일러는 foo::impl의 전체 선언이 필요한 기본 소멸자를 생성합니다.

템플릿 문제 및 정적 기간 인스턴스

템플릿 생성자를 사용하면 다음과 같은 경우에도 합병증이 발생합니다. impl_ 멤버가 구성되지 않은 경우:

template <typename T>
foo::foo(T bar) {
    // Compiler requires knowledge of impl_ destruction at compile time!
}
또한 네임스페이스 범위에서 불완전한 유형과 함께 Unique_ptr을 사용하면 실패합니다.

class impl;
std::unique_ptr<impl> impl_;
컴파일러는 이 정적 기간 객체를 삭제하는 방법을 알아야 합니다. . 해결 방법은 사용자 정의 유형을 정의하는 것입니다.

위 내용은 Pimpl 관용구에서 `std::unique_ptr`이 불완전한 유형으로 인해 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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