Keduanya std::forwarddan std::movetidak lain adalah gips.
X x;
std::move(x);
Di atas melemparkan ekspresi lvalue xtipe X ke ekspresi rvalue tipe X (nilai x lebih tepatnya). movejuga 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::forwardAnda dapat memilih tujuan sampai batas tertentu:
X x;
std::forward<Y>(x);
Melemparkan ekspresi nilai xdari 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).
forwarddapat 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.