Rumah >pembangunan bahagian belakang >C++ >Mengapakah `printme({\'a\', \'b\', \'c\'});` Haram dalam Potongan Jenis Templat C?

Mengapakah `printme({\'a\', \'b\', \'c\'});` Haram dalam Potongan Jenis Templat C?

Patricia Arquette
Patricia Arquetteasal
2024-12-02 20:24:14424semak imbas

Why is `printme({'a', 'b', 'c'});` Illegal in C   Template Type Deduction?

Jenis Potongan dalam Fungsi dengan Senarai Pemula

Pertimbangkan templat fungsi:

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

Fungsi ini mengharapkan satu parameter jenis dengan permulaan () dan tamat() fungsi.

Soalan:

Mengapa panggilan berikut haram?

printme({'a', 'b', 'c'});

Jawapan:

Panggilan printme({'a', 'b', 'c'}) adalah haram kerana hujah templat T tidak boleh disimpulkan. Tanpa menyatakan hujah templat secara eksplisit, pengkompil tidak boleh menentukan jenis parameter, kerana ia boleh menjadi sebarang jenis dengan fungsi begin() dan end(). Isu ini tidak timbul dalam kes berikut:

  • Spesifikasi hujah templat eksplisit: printme>({'a', 'b', 'c'})
  • Jenis parameter dengan potongan jenis: printme(std::vector({'a', 'b', 'c'}))
  • Menggunakan auto untuk menyimpulkan jenis: const auto il = {'a', 'b', 'c'}; printme(il);
  • Menentukan hujah templat secara eksplisit: printme>({'a', 'b', 'c'})
  • Pengecualian untuk ini ialah potongan auto sebagai std::initializer_list, yang berbeza daripada potongan hujah templat. Tingkah laku ini dinyatakan secara eksplisit dalam piawaian C 11 (§ 14.8.2.5/5), yang menyatakan bahawa hujah templat untuk parameter fungsi yang merupakan senarai pemula tetapi bukan jenis std::initializer_list tidak disimpulkan. Walau bagaimanapun, § 7.1.6.4/6 standard menyediakan sokongan yang jelas untuk auto untuk menyimpulkan std::initializer_list<>.

    Atas ialah kandungan terperinci Mengapakah `printme({\'a\', \'b\', \'c\'});` Haram dalam Potongan Jenis Templat C?. 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