Rumah > pembangunan bahagian belakang > C++ > Mengapa Potongan Jenis Templat Gagal dengan `inisializer_list` dalam Contoh Ini?

Mengapa Potongan Jenis Templat Gagal dengan `inisializer_list` dalam Contoh Ini?

Susan Sarandon
Lepaskan: 2024-11-28 18:47:11
asal
682 orang telah melayarinya

Why Does Template Type Deduction Fail with `initializer_list` in This Example?

Potongan Jenis Templat dengan initializer_list

Pertimbangkan fungsi berikut:

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

Fungsi di atas mengharapkan satu parameter dengan begin() dan end() fungsi ahli. Terdapat beberapa cara untuk memanggil fungsi ini dengan jenis data yang berbeza. Sebagai contoh, kita boleh menggunakan std::vector, std::string, std::array, atau bahkan senarai pemula. Walau bagaimanapun, terdapat satu kes tertentu yang menyalahi undang-undang:

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

Barisan kod ini akan mengakibatkan ralat masa kompilasi. Mengapakah ini berlaku?

Kegagalan Potongan Argumen Templat

Penolakan jenis untuk argumen templat hanya boleh berjaya jika jenis parameter fungsi sepadan dengan jenis argumen yang dibekalkan. Dalam kes fungsi printme:

  • Argumen std::vector, std::string, dan std::array semuanya mempunyai jenis yang jelas yang sepadan dengan jenis parameter fungsi (cth., std::vector).
  • Argumen senarai pemula ({'a', 'b', 'c'}) tidak mempunyai jenis yang jelas. Ia ialah objek sementara yang tidak dikaitkan dengan jenis tertentu.
  • Akibatnya, pengkompil tidak dapat menyimpulkan hujah templat T dalam kes argumen senarai pemula. Menentukan hujah templat secara eksplisit akan menyelesaikan isu (cth., printme>({'a', 'b', 'c'})).

    Kes Khas untuk auto

    Walaupun argumen senarai pemula adalah menyalahi undang-undang dalam fungsi printme, ia adalah sah untuk menggunakan auto untuk memulakan pembolehubah yang memegang senarai pemula. Ini kerana auto akan menyimpulkan jenis il sebagai std::initializer_list, membenarkan pengkompil menyimpulkan hujah templat dalam printme(il).

    Atas ialah kandungan terperinci Mengapa Potongan Jenis Templat Gagal dengan `inisializer_list` dalam Contoh Ini?. 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