Rumah > pembangunan bahagian belakang > C++ > Mengapakah Saya Tidak Boleh Menjemput Pembina Templat secara Eksplisit dalam Senarai C Initializer?

Mengapakah Saya Tidak Boleh Menjemput Pembina Templat secara Eksplisit dalam Senarai C Initializer?

Mary-Kate Olsen
Lepaskan: 2024-11-29 15:12:11
asal
965 orang telah melayarinya

Why Can't I Explicitly Invoke Template Constructors in C   Initializer Lists?

Seruan Eksplisit Pembina Templat dalam Senarai Pemula

Dalam C , tidak mungkin untuk menggunakan pembina templat secara eksplisit dalam senarai pemula. Pertimbangkan contoh berikut:

struct T { 
    template<class> T();
};

struct U {
    U() : t<void>() {} //does not work
    T t;
};
Salin selepas log masuk

Kod ini akan gagal untuk disusun, kerana C Standard secara jelas tidak membenarkan senarai argumen templat eksplisit untuk templat fungsi ahli pembina. Ini disebabkan oleh sintaks unik pembina, yang tidak mempunyai nama fungsi.

Penjelasan: C Standard menyatakan dalam Bahagian 14.8.1/7:

"Oleh kerana senarai hujah templat eksplisit mengikut nama templat fungsi, dan kerana templat fungsi ahli penukaran dan templat fungsi ahli pembina dipanggil tanpa menggunakan nama fungsi, tiada cara untuk menyediakan senarai hujah templat eksplisit untuk templat fungsi ini."

Penyelesaian: Jika seruan eksplisit pembina templat diperlukan dalam senarai pemula, penyelesaian boleh dibuat digunakan menggunakan jenis tersuai dengan pembina yang menerima parameter templat sebagai hujah:

struct T { 
    template<class U> T(identity<U>);
};

struct U {
    U() : t(identity<void>()) {}
    T t;
};
Salin selepas log masuk

Dalam kes ini, identiti taip daripada perpustakaan Boost atau std::type_identity daripada C 20 boleh digunakan untuk mewakili jenis parameter templat. Ini membolehkan pembina templat digunakan secara tidak langsung menggunakan objek jenis tersuai ini.

Atas ialah kandungan terperinci Mengapakah Saya Tidak Boleh Menjemput Pembina Templat secara Eksplisit dalam Senarai C Initializer?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan