Wystarczy, aby potwierdzić to, co ja zrozumiałem o std::move
dlaczego std :: move wykorzystywane forward_reference zamiast lvaue odniesienia
std::move
- konwertuje T&
do T&&
tak, że konstruktor T's
posunięcie kopać (jeśli istnieje w przeciwnym razie konstruktor kopia będzie odegrać swoją rolę, chyba że nie zostaniemy usunięci z zewnątrz, przenieść ctor/cesję).
kiedy szukałem w ewentualnej realizacji std::move
to jak
template<typename T>
typename remove_reference<T>::type&& move(T&& param)
{
using ReturnType =typename remove_reference<T>::type&&;
return static_cast<ReturnType>(param);
}
przyczyną tego, że używa remove_reference<T>
właśnie z powodu zapadania referencyjnej, stosowanej przez forward_reference T&&
Zastanawiam się tylko, dlaczego potrzebujesz referencji do przodu, czy nie mogliśmy tego zrobić przez
template<typename T>
T&& moveInQuestion(T& p){
return static_cast<T&&>(p);
}
struct someType{};
someType lvalref;
static_assert(is_same<decltype(moveInQuestion(lvalref)),decltype(std::move(lvalref))>::value,"");
static_assert
nie powiodło się.
Sądzę też, że kategoria wartości oznaczająca std::move
to lvalue
. Czy to możliwe, że moveInQuestion
może być lepszy niż std::move
?