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
Lepaskan: 2024-12-02 20:24:14
asal
414 orang telah melayarinya

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;
}
Salin selepas log masuk

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

Soalan:

Mengapa panggilan berikut haram?

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

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!

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