Rumah >pembangunan bahagian belakang >C++ >Mengapakah `std::unique_ptr` Gagal dengan Jenis Tidak Lengkap dalam Pimpl Idiom?

Mengapakah `std::unique_ptr` Gagal dengan Jenis Tidak Lengkap dalam Pimpl Idiom?

DDD
DDDasal
2024-12-13 05:01:11460semak imbas

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

std::unique_ptr dan Jenis Tidak Lengkap: Pandangan Lebih Dalam

Pertimbangkan simpulan bahasa pimpl yang menggunakan std::unique_ptr:

class window {
  window(const rectangle& rect);

private:
  class window_impl; // defined elsewhere
  std::unique_ptr<window_impl> impl_; // won't compile
};

Walau bagaimanapun, ralat penyusunan timbul disebabkan oleh jenis tidak lengkap:

"Aplikasi 'sizeof' tidak sah pada jenis tidak lengkap 'uixx::window::window_impl'"

Secara tradisinya, std::unique_ptr serasi dengan jenis yang tidak lengkap. Jadi, di manakah letaknya isunya?

Inti Perkara: Kemusnahan

Kuncinya terletak pada kemusnahan. Jika pimpl digunakan dengan unique_ptr, pemusnah mesti diisytiharkan secara eksplisit:

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
};

Jika tidak, pengkompil menjana pemusnah lalai yang memerlukan pengisytiharan lengkap foo::impl.

Masalah Templat dan Kejadian Statik

Dengan templat pembina, komplikasi timbul walaupun ahli impl_ tidak dibina:

template <typename T>
foo::foo(T bar) {
    // Compiler requires knowledge of impl_ destruction at compile time!
}

Selain itu, penggunaan unique_ptr dengan jenis yang tidak lengkap pada skop ruang nama gagal:

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

Pengkompil perlu mengetahui cara untuk musnahkan objek tempoh statik ini. Penyelesaian melibatkan penentuan jenis tersuai:

class impl;
struct ptr_impl : std::unique_ptr<impl> {
    ~ptr_impl(); // Implement (empty body) elsewhere
} impl_;

Atas ialah kandungan terperinci Mengapakah `std::unique_ptr` Gagal dengan Jenis Tidak Lengkap dalam Pimpl Idiom?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn