Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah `std::forward` melumpuhkan potongan hujah templat?

Mengapakah `std::forward` melumpuhkan potongan hujah templat?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-12 22:47:02285semak imbas

Why does `std::forward` disable template argument deduction?

Melumpuhkan Potongan Argumen Templat dengan std::forward

Mengapa Potongan Argumen Templat Dilumpuhkan dengan std::forward?

Fungsi std::forward, dalam pelaksanaan tertentu (cth., VS2010), menggunakan metafungsi templat yang dipanggil identiti untuk tidak membenarkan potongan hujah templat. Ini dilakukan untuk mengekalkan kawalan tepat ke atas tingkah laku std::forward dalam situasi yang melibatkan rujukan nilai dan rujukan nilai konst.

Implikasi Penggunaan Potongan Argumen Templat

Jika std::forward akan menggunakan potongan hujah templat, ia akan mengakibatkan kesimpulan parameter templat (T) berdasarkan jenis hujah input. Tingkah laku ini menjadi bermasalah apabila hujah input ialah nilai l atau nilai const (cth., pembolehubah dengan nama). Dalam kes sedemikian, potongan hujah templat akan tersilap menyimpulkan T sebagai rujukan nilai atau rujukan nilai konst, yang membawa kepada penghantaran jenis yang salah.

Pertimbangkan contoh berikut:

<code class="cpp">template<typename T>
T&& forward_with_deduction(T&& obj)
{
    return static_cast<T&&>(obj);
}</code>

Apabila menghantar pembolehubah bernama atau pemalar ke hadapan_dengan_potongan, ia akan mentafsirkannya secara salah sebagai rujukan nilai atau rujukan nilai tetap, menyebabkan T disimpulkan sedemikian. Akibatnya, operasi static_cast akan meruntuhkan jenis kepada rujukan lvalue atau const lvalue rujukan, walaupun menjangkakan rujukan universal (T&&).

Contoh:

<code class="cpp">int x;
int&& z = std::move(x);

// Incorrectly deduces T to be int& and casts z as int&
forward_with_deduction(z); // calls test(int&) instead of test(int&&)</code>

Penyelesaian dalam std::forward

Untuk memastikan penghantaran hujah yang betul dalam semua kes, std::forward menggunakan metafungsi identiti. identiti bertindak sebagai jenis pegangan tempat yang menghalang pengkompil daripada menyimpulkan parameter templat. Akibatnya, std::forward sentiasa mentafsir argumen input sebagai rujukan universal, tanpa mengira jenis sebenar.

Dengan menghantar argumen input kepada rujukan universal, std::forward mendayakan pemajuan objek yang sempurna, walaupun ia adalah nilai atau nilai tetap. Tingkah laku ini memastikan bahawa jenis hujah yang dimajukan kekal sebagai rujukan universal sepanjang proses pemajuan.

Atas ialah kandungan terperinci Mengapakah `std::forward` melumpuhkan potongan hujah templat?. 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