Jak najlepiej odpowiedzieć na pytanie co robi std::move?

0

Hejka,

tak sobie myślę, że jeśli zostałbym przez kogoś zapytany co robi std::move, to czy taka ogólna odpowiedź "zwraca referencję do r-wartości przekazanego argumentu" byłaby wystarczająca? Czy może odpowiedzieć coś w stylu "std::move zwraca rzutowany na referencję do r-wartości obiekt typu T"? :D

No i tak trochę z innej beczki: czy std::move sprawdza możliwość przeniesienia rzutowania przekazanego obiektu czy bezwzględnie go zwraca? Wiem, że std::forward w zależności czy typ T jest l-wartością czy r-wartością zwraca r-wartość lub nie.

Pozdro :P

1

std::move to po prostu rvalue_cast<>, nazywający się tak jak się nazywa ze względu na intencję jego użycia.

0

haha pogmatwane to. Niby przenosi, a tak naprawdę rzutuje i jeszcze do tego może zacyganić wartość, wtf.

2

Samo std::move nigdy nie "zacygani" wartości:

std::string foo = "foo";
std::move(foo); // NO-OP
static_cast<std::string&&>(foo); // NO-OP, dokładnie to samo co wyżej
0

właśnie wiem, że może czasami kopiować, ale to muszę dokładniej obadać sytuacje w praktyce aby się gdzieś kiedyś nie nadziać.

2

Nie nie nie. std::move to jest cast (konkretnie: static_cast<std::remove_reference_t<decltype(x)>&&>(x)), sam z siebie nie robi nic.

0

lol, myślałem, że jeśli nie jest możliwa operacja przeniesienia, to następuje kopiowanie. Może przekręciłem coś? hmm. jeszcze bardziej mam mindfuck teraz, a myślałem, że w miarę się zorientowałem co to to robi ;_; W każdym razie dzięki za pomoc, muszę po prostu zacząć kodować. Fajnie by było, gdybym mógł jeszcze się w jakiś sposób upewnić, że poprawnie użyłem std::move (w sensie, że dane zostały przeniesione do innego obiektu).

2

Może dyskutuujemy o różnych rzeczach. Pytałeś co robi std::move(). Poprawną odpowiedzią jest to, że nie robi nic (zamienia tylko typ argumentu na rvalue ref, czyli jest takim rvalue_castem). Wywołane samo sobie nie ma żadnych efektów.

Jeśli natomiast mówimy o przekazywaniu argumentów do funkcji przez przeniesienie (np. z użyciem std::move), to już co innego. Ale też prawdą jest, że copy is a valid implementation of move, więc kopia jak najbardziej może być wykonana jako move.

0

ohhhhhhhhh w końcu zrozumiałem!!! Dziękuję bardzo za pomoc, nie zorientowałem się wcześniej, że ja myliłem te oba użycia std::move, które wymieniłeś w swoim poście. Teraz w końcu nabiera to sensu :D Wielkie dzięki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1