Rumah >pembangunan bahagian belakang >C++ >Mengapakah `std::forward` melumpuhkan potongan hujah templat dalam Visual Studio 2010?

Mengapakah `std::forward` melumpuhkan potongan hujah templat dalam Visual Studio 2010?

Barbara Streisand
Barbara Streisandasal
2024-11-05 17:45:02577semak imbas

Why does `std::forward` disable template argument deduction in Visual Studio 2010?

Melumpuhkan Potongan Argumen Templat dalam std::forward

Pernyataan Masalah

Visual Studio 2010 mentakrifkan std::forward to lumpuhkan potongan hujah templat. Mengapakah pelumpuhan ini disengajakan?

Jawapan

Potongan hujah templat akan membawa kepada penentuan jenis yang salah dan tingkah laku yang salah dalam std::forward. Begini caranya:

Kes Tanpa Potongan Hujah Templat

Tanpa potongan hujah templat, std::forward ditakrifkan sebagai:

<code class="cpp">template<class _Ty> inline
_Ty&amp;&amp; forward(typename identity<_Ty>::type&amp; _Arg) {
    return ((_Ty&amp;&amp;)_Arg);
}</code>

Kes Dengan Potongan Hujah Templat

Jika std::forward menggunakan potongan hujah templat, senario berikut akan timbul:

  • Untuk rujukan nilai kepada objek jenis X (cth., func() atau 7), potongan hujah templat akan menentukan T dengan betul sebagai X.
  • Untuk nilai l atau nilai const (cth., objek dengan nama), potongan hujah templat akan tersilap menentukan T sebagai nilai l rujukan atau rujukan nilai const.

Implikasi Penentuan Jenis Salah

Dalam pemajuan sempurna, hujah yang dihantar kepada std::forward ialah nilai l. Jika potongan hujah templat didayakan, jenis T yang disimpulkan akan menjadi rujukan nilai. Walau bagaimanapun, "pemajuan sempurna" membayangkan rujukan nilai.

Pelakon dalam std::forward, static_cast(arg), akan sentiasa runtuh kepada rujukan lvalue, walaupun argumen asal ialah rvalue. Ini akan membawa kepada penghantaran yang salah dan mekanisme pemajuan yang tidak berfungsi dengan betul.

Contoh

Kod berikut menunjukkan isu dengan potongan hujah templat:

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

int main() {
    int x;
    int& y = x;
    int&& z = std::move(x);

    forward_with_deduction(7); // Correctly calls forward(int&&)
    forward_with_deduction(y); // Incorrectly calls forward(int&)

    std::forward<int&>(y); // Correctly calls forward(int&)
}</code>

Kesimpulan

Melumpuhkan potongan hujah templat dalam std::forward adalah penting untuk pemajuan sempurna berfungsi dengan betul. Ia menghalang penentuan jenis yang salah dan memastikan bahawa rujukan rnilai dimajukan dengan betul sebagai rujukan rnilai.

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