Rumah > pembangunan bahagian belakang > C++ > Mengapa Potongan Templat Gagal dengan Senarai Pemula dalam C ?

Mengapa Potongan Templat Gagal dengan Senarai Pemula dalam C ?

Mary-Kate Olsen
Lepaskan: 2024-11-29 16:39:09
asal
736 orang telah melayarinya

Why Does Template Deduction Fail with Initializer Lists in C  ?

Senarai Potongan Templat dan Pemula

Pertimbangkan fungsi berikut:

template<typename T>
void printme(T&& t) {
  for (auto i : t)
    std::cout << i;
}
Salin selepas log masuk

Fungsi ini mengambil satu parameter dengan permulaan()/akhir () jenis yang didayakan. Walau bagaimanapun, coretan kod berikut dianggap menyalahi undang-undang:

printme({'a', 'b', 'c'});
Salin selepas log masuk

Walaupun kod serupa yang menggunakan vektor, rentetan, tatasusunan dan senarai pemula eksplisit berfungsi tanpa masalah. Timbul persoalan, mengapakah coretan khusus ini menyalahi undang-undang?

Kunci untuk memahami isu ini terletak pada potongan hujah templat. Dalam kes ini, hujah templat T tidak boleh disimpulkan. Untuk membetulkan perkara ini, seseorang mesti menyatakan dengan jelas hujah templat, seperti yang dilihat di bawah:

printme<vector<char>>({'a', 'b', 'c'})
printme<initializer_list<char>>({'a', 'b', 'c'})
Salin selepas log masuk

Dalam coretan yang dinyatakan di atas di mana kod itu sah, hujah itu mempunyai jenis yang jelas, membenarkan hujah templat T untuk disimpulkan dengan lancar. Penggunaan auto juga membolehkan fungsi berfungsi, kerana ia menyimpulkan jenis std::initializer_list.

Walau bagaimanapun, tingkah laku pelik timbul apabila membandingkan potongan hujah templat dan kata kunci auto. Walaupun auto membuat kesimpulan jenis std::initializer_list, potongan hujah templat tidak. Ini kerana piawaian C 11 secara eksplisit menyatakan bahawa ini adalah konteks yang tidak disimpulkan untuk hujah templat apabila parameter fungsi ialah senarai pemula, tetapi parameter tidak mempunyai std::initializer_list atau rujukan kepada std yang berkemungkinan cv-qualified ::initializer_list type.

Walau bagaimanapun, kata kunci auto secara khusus menyokong std::initializer_list<>, membenarkan kod berfungsi dengan betul.

Atas ialah kandungan terperinci Mengapa Potongan Templat Gagal dengan Senarai Pemula dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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