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 중국어 웹사이트의 기타 관련 기사를 참조하세요!