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
Susan Sarandonasal
2024-11-28 18:47:11682semak imbas

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;
}

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'});

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!

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