Rumah >pembangunan bahagian belakang >C++ >Mengapa Parameter Jenis Templat Tidak Boleh Disimpulkan daripada Argumen Fungsi Lalai dalam C ?

Mengapa Parameter Jenis Templat Tidak Boleh Disimpulkan daripada Argumen Fungsi Lalai dalam C ?

Linda Hamilton
Linda Hamiltonasal
2024-11-05 00:24:02668semak imbas

Why Can't Template Type Parameters Be Deduced from Default Function Arguments in C  ?

Mengapa Parameter Jenis Templat Tidak Boleh Ditolak daripada Argumen Fungsi Lalai

Dalam C , salah tanggapan biasa ialah pengkompil boleh menyimpulkan parameter jenis templat daripada argumen fungsi lalai. Walau bagaimanapun, ini tidak berlaku.

Apabila menemui 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);  // Error: could not deduce template argument for T
}</code>

pengkompil gagal menyimpulkan jenis T daripada argumen lalai 0.0f. Sebaliknya, ia memerlukan spesifikasi yang jelas, seperti dalam a.bar(5).

C 03 Larangan

Dalam C 03, spesifikasi bahasa secara eksplisit melarang penggunaan argumen fungsi lalai untuk potongan hujah templat (C 03 §14.8.2/17):

A template type-parameter cannot be deduced from the type of a function default argument.

C 11 Argumen Templat Lalai

Dalam C 11, penyelesaian muncul: memperkenalkan argumen templat lalai. Dengan mengubah suai kod seperti berikut:

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

parameter templat lalai T disediakan. Walau bagaimanapun, perlu diambil perhatian bahawa mempunyai argumen templat lalai tidak mengurangkan sekatan pada argumen fungsi lalai.

Menurut C 11 14.8.2.5/5, argumen fungsi lalai dianggap "konteks tidak disimpulkan" dalam proses pemotongan hujah templat. Ini bermakna pengkompil tidak boleh menggunakan nilai lalai daripada argumen fungsi untuk membuat kesimpulan parameter jenis templat.

Kesimpulan

Walaupun argumen fungsi lalai memberikan kemudahan, parameter jenis templat tidak boleh disimpulkan daripada mereka. Untuk kes di mana nilai lalai diperlukan, argumen templat lalai menawarkan penyelesaian yang lebih mudah alih dan fleksibel.

Atas ialah kandungan terperinci Mengapa Parameter Jenis Templat Tidak Boleh Disimpulkan daripada Argumen Fungsi Lalai dalam 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