2017-07-04 30 views
6

Wystarczy, aby potwierdzić to, co ja zrozumiałem o std::movedlaczego 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?

Odpowiedz

8

Zazwyczaj przykładem jest kod rodzajowy jak

template<class T> 
T frob() { 
    std::vector<T> x = /* ... */; 
    return std::move(x[0]); 
} 

ze swoimi move, to łamie gdy T jest bool, ponieważ w takim przypadku x[0] jest prvalue odniesienia proxy zamiast lwartością.