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&& forward(typename identity<_Ty>::type& _Arg) { return ((_Ty&&)_Arg); }</code>
Kes Dengan Potongan Hujah Templat
Jika std::forward menggunakan potongan hujah templat, senario berikut akan timbul:
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
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!