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

Mengapa Potongan Jenis Templat Gagal dengan `inisializer_list` dalam C?

Susan Sarandon
Lepaskan: 2024-12-05 01:52:09
asal
192 orang telah melayarinya

Why Does Template Type Deduction Fail with `initializer_list` in C  ?

initializer_list dan Potongan Jenis Templat

Potongan jenis templat ialah ciri berkuasa C yang membolehkan pengkompil membuat kesimpulan jenis argumen templat daripada argumen yang dihantar kepada templat. Walau bagaimanapun, dalam beberapa kes, pengkompil tidak dapat menyimpulkan argumen jenis, dan templat mesti dinyatakan secara eksplisit dengan argumen jenis yang diingini.

Pertimbangkan fungsi berikut:

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

Ini fungsi menjangkakan satu parameter dengan jenis didayakan begin()/end(). Persoalannya, mengapa kod berikut menyalahi undang-undang?

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

Apabila semua ini sah:

printme(std::vector<char>({'a', 'b', 'c'}));
printme(std::string("abc"));
printme(std::array<char, 3> {'a', 'b', 'c'});
Salin selepas log masuk

Kita juga boleh menulis ini:

const auto il = {'a', 'b', 'c'};
printme(il);
Salin selepas log masuk

Atau:

printme<std::initializer_list<char>>({'a', 'b', 'c'});
Salin selepas log masuk

Barisan pertama kod adalah menyalahi undang-undang kerana hujah templat T tidak dapat disimpulkan. Jika hujah templat dinyatakan secara eksplisit, ia akan berfungsi, cth.:

printme<std::vector<char>>({'a', 'b', 'c'})
Salin selepas log masuk

Atau:

printme<std::initializer_list<char>>({'a', 'b', 'c'})
Salin selepas log masuk

Baris kod yang lain adalah sah kerana hujah itu mempunyai jenis yang jelas , jadi hujah templat T boleh disimpulkan dengan baik.

Bahagian yang mungkin mengelirukan ialah auto akan memilih jenis std::initializer_list tetapi hujah templat tidak akan. Ini kerana § 14.8.2.5/5 daripada piawaian C 11 secara eksplisit menyatakan bahawa ini ialah konteks tidak disimpulkan untuk hujah templat:

A function parameter for which the associated argument is an initializer list (8.5.4) but the parameter does not have std::initializer_list or reference to possibly cv-qualified std::initializer_list type.
Salin selepas log masuk

Walau bagaimanapun, dengan auto, § 7.1.6.4/6 mempunyai sokongan eksplisit untuk std::initializer_list<>:

if the initializer is a braced-init-list (8.5.4), with std::initializer_list<U>.
Salin selepas log masuk

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