Keduanya std::forward
dan std::move
tidak lain adalah gips.
X x;
std::move(x);
Di atas melemparkan ekspresi lvalue x
tipe X ke ekspresi rvalue tipe X (nilai x lebih tepatnya). move
juga dapat menerima nilai:
std::move(make_X());
dan dalam hal ini ini adalah fungsi identitas: mengambil nilai tipe X dan mengembalikan nilai tipe X.
Dengan std::forward
Anda dapat memilih tujuan sampai batas tertentu:
X x;
std::forward<Y>(x);
Melemparkan ekspresi nilai x
dari tipe X ke ekspresi tipe Y. Ada kendala pada apa yang bisa Y.
Y dapat menjadi Pangkalan X yang dapat diakses, atau referensi ke Pangkalan X. Y dapat menjadi X, atau referensi ke X. Seseorang tidak dapat membuang kualifikasi cv forward
, tetapi seseorang dapat menambahkan kualifikasi cv. Y tidak dapat menjadi tipe yang hanya dapat dikonversi dari X, kecuali melalui konversi Basis yang dapat diakses.
Jika Y adalah referensi lvalue, hasilnya akan menjadi ekspresi lvalue. Jika Y bukan referensi lvalue, hasilnya akan menjadi ekspresi rvalue (xvalue tepatnya).
forward
dapat mengambil argumen nilai hanya jika Y bukan referensi nilai tinggi. Artinya, Anda tidak dapat memberikan nilai ke nilai. Ini untuk alasan keamanan karena melakukan hal itu biasanya mengarah pada referensi yang menggantung. Tapi casting nilai untuk nilai adalah baik dan diizinkan.
Jika Anda mencoba menentukan Y untuk sesuatu yang tidak diizinkan, kesalahan akan ditangkap pada waktu kompilasi, bukan waktu berjalan.