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?

Susan Sarandon
Susan Sarandonasal
2024-12-18 03:56:09454semak imbas

Why Can't I Explicitly Invoke a Template Constructor in a C   Initializer List?

Seruan Pembina Templat Eksplisit dalam C

Dalam C , tidak mungkin untuk memanggil pembina templat secara eksplisit dalam senarai pemula. Ini disebabkan oleh sintaks khusus yang digunakan untuk hujah templat, yang mengikut nama templat fungsi dan bukannya disertakan dalam kurungan semasa pembinaan.

Seperti yang dinyatakan dalam Standard C (14.8.1/7):

[Nota: 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, terdapat bukan cara untuk menyediakan senarai hujah templat eksplisit untuk templat fungsi ini. ]

Oleh itu, contoh berikut tidak akan berfungsi:

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

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

Dalam kes ini, pengkompil akan cuba mentafsir t sebagai jenis kelas asas dan akan gagal mencari pembina lalai yang sepadan.

Penyelesaian

Untuk mengatasi had ini, seseorang boleh menggunakan templat fungsi yang mengambil jenis identiti sebagai hujah:

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

struct U {
    U() : t(identity<void>()) {}
    T t;
};

Diberi takrifan identiti berikut daripada Boost:

template<typename T> struct identity { typedef T type; };

atau, dalam C 20, menggunakan std::type_identity:

using ::std::type_identity;

pendekatan ini dengan berkesan membenarkan menghantar hujah templat kepada pembina dalam senarai pemula.

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!

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