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

Mary-Kate Olsen
Lepaskan: 2024-11-12 22:47:02
asal
248 orang telah melayarinya

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

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

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!

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