Rumah > pembangunan bahagian belakang > C++ > Mengapa Potongan Argumen Templat Dilumpuhkan dalam std::forward dalam Visual Studio 2010?

Mengapa Potongan Argumen Templat Dilumpuhkan dalam std::forward dalam Visual Studio 2010?

Linda Hamilton
Lepaskan: 2024-11-05 18:05:02
asal
487 orang telah melayarinya

Why is Template Argument Deduction Disabled in std::forward in Visual Studio 2010?

Melumpuhkan Potongan Argumen Templat dalam std::forward

Soalan:

Mengapa templat potongan hujah dilumpuhkan dalam pelaksanaan std::forward dalam Visual Studio 2010?

Jawapan:

std::forward ialah fungsi utiliti yang digunakan untuk pemajuan yang sempurna, di mana jenis argumen input dikekalkan dalam argumen output. Walau bagaimanapun, jika potongan hujah templat didayakan dalam std::forward, ia boleh membawa kepada gelagat yang salah dalam senario tertentu.

Khususnya, jika hujah input ialah lvalue atau const lvalue (iaitu, objek dengan nama ), potongan hujah templat akan menyimpulkan jenis parameter menjadi rujukan nilai atau nilai tetap. Dalam senario pemajuan yang sempurna, ini bukanlah perkara yang diingini, kerana matlamatnya adalah untuk mengekalkan jenis argumen input yang tepat.

Untuk menggambarkan isu yang berpotensi:

<code class="cpp">template<typename T>
void test(T&& obj)
{
    // ...
}

int main()
{
    int x;
    int& y = x;

    test(7);       // input is an rvalue, so T is deduced as int&&
    test(x);       // input is an lvalue, so T is deduced as int&
    test(y);       // input is a named lvalue, so T is deduced as int&
}</code>
Salin selepas log masuk

Dalam ini contoh, jika std::forward menggunakan potongan hujah templat, jenis hujah dalam test(x) dan test(y) akan disimpulkan secara salah sebagai int&, yang membawa kepada tingkah laku yang tidak dijangka.

Untuk mengelakkan isu ini, pelaksanaan std::forward menggunakan metafungsi identiti untuk menentukan parameter jenis secara eksplisit, dengan berkesan melumpuhkan potongan hujah templat. Ini memastikan bahawa jenis argumen input dikekalkan dalam argumen output tidak kira sama ada ia nilai r atau lnilai.

Atas ialah kandungan terperinci Mengapa Potongan Argumen Templat Dilumpuhkan dalam std::forward dalam Visual Studio 2010?. 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