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
643 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!

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