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
Lepaskan: 2024-12-18 03:56:09
asal
471 orang telah melayarinya

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;
};
Salin selepas log masuk

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;
};
Salin selepas log masuk

Diberi takrifan identiti berikut daripada Boost:

template<typename T> struct identity { typedef T type; };
Salin selepas log masuk

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

using ::std::type_identity;
Salin selepas log masuk

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!

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