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>
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!