Hem std::forward
ve std::move
başka bir şey yayınları bulunmaktadır.
X x;
std::move(x);
Yukarıda x
X tipi lvalue ifadesi X tipi bir rvalue ifadesine (tam olarak bir xvalue) verilir. move
ayrıca bir rvalue kabul edebilir:
std::move(make_X());
ve bu durumda bir kimlik fonksiyonudur: X tipi bir değer alır ve X tipi bir değer döndürür.
İle std::forward
hedefi bir dereceye kadar seçebilirsiniz:
X x;
std::forward<Y>(x);
x
X türünün lvalue ifadesini Y türündeki bir ifadeye çevirir . Y'nin ne olabileceği konusunda kısıtlamalar vardır.
Y erişilebilir bir X Tabanı veya X Tabanı referansı olabilir. Y X veya X referansı olabilir. forward
. Y, erişilebilir bir Taban dönüşümü dışında X'ten dönüştürülebilen bir tür olamaz.
Y bir değer değeri referansıysa, sonuç bir değer değeri ifadesi olacaktır. Y bir değer değeri başvurusu değilse, sonuç bir değer (kesin olacak x değeri) ifadesi olur.
forward
rvalue bağımsız değişkenini yalnızca Y bir lvalue referansı değilse alabilir. Yani, değer için bir değer atayamazsınız. Bu, güvenlik nedenlerinden ötürü yaygın bir şekilde yapılması, sallanan referanslara yol açmaktadır. Ancak bir rvalue'yu rvalue'ya dökmek tamamdır ve izin verilir.
İzin verilmeyen bir şeye Y belirtmeye çalışırsanız, hata çalışma zamanında değil derleme zamanında yakalanır.