Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa C Tidak Dapat Menyimpulkan Argumen Templat daripada Argumen Fungsi Lalai?

Mengapa C Tidak Dapat Menyimpulkan Argumen Templat daripada Argumen Fungsi Lalai?

DDD
DDDasal
2024-11-05 09:14:02944semak imbas

Why Can't C   Deduce Template Arguments from Default Function Arguments?

Penolakan Argumen Templat daripada Argumen Fungsi Lalai

Dalam C , pengaturcara sering menghadapi senario di mana mereka perlu menyimpulkan hujah templat daripada panggilan fungsi. Walau bagaimanapun, mungkin terdapat kes di mana potongan ini gagal, yang membawa kepada ralat pengkompil. Satu kes sedemikian ialah ketidakupayaan untuk menyimpulkan parameter jenis templat daripada argumen fungsi lalai.

Pertimbangkan coretan kod berikut:

<code class="cpp">struct foo {
  template <typename T>
  void bar(int a, T b = 0.0f) {
  }
};

int main() {
  foo a;
  a.bar(5);
}</code>

Setelah menyusun kod ini, pengkompil mungkin menghasilkan ralat yang menyatakan, "tidak dapat menyimpulkan hujah templat untuk T." Untuk menyelesaikan isu ini, seseorang perlu menyatakan hujah templat secara eksplisit dalam panggilan fungsi, seperti a.bar(5). Tetapi mengapa pengkompil gagal untuk menyimpulkan jenis di tempat pertama?

Dalam C 03, spesifikasi bahasa secara eksplisit melarang penggunaan argumen lalai untuk menyimpulkan hujah templat. Menurut C 03 §14.8.2/17, "Parameter jenis templat tidak boleh disimpulkan daripada jenis argumen lalai fungsi."

Dalam C 11, bahasa memperkenalkan ciri baharu yang membenarkan penyediaan lalai hujah templat untuk templat fungsi:

<code class="cpp">template <typename T = float>
void bar(int a, T b = 0.0f) { }</code>

Walau bagaimanapun, hujah templat lalai adalah wajib. Jika ia tidak disediakan, pengkompil masih melarang penggunaan argumen fungsi lalai untuk potongan hujah templat. C 11 §14.8.2.5/5 menyatakan bahawa:

"Parameter templat yang digunakan dalam jenis parameter parameter fungsi yang mempunyai argumen lalai yang sedang digunakan dalam panggilan untuk potongan argumen sedang dilakukan" ialah konteks yang tidak disimpulkan.

Ringkasnya, sambil menyediakan argumen lalai untuk parameter fungsi boleh memudahkan kod, adalah penting untuk memahami batasan potongan hujah templat dalam kes sedemikian. Argumen lalai hanya boleh digunakan untuk potongan argumen templat jika argumen templat lalai diberikan secara eksplisit.

Atas ialah kandungan terperinci Mengapa C Tidak Dapat Menyimpulkan Argumen Templat daripada Argumen Fungsi Lalai?. 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