Chỉ để xác nhận những gì tôi hiểu về std::move
tại sao std :: chuyển mất forward_reference thay vì tham khảo lvaue
std::move
- chuyển đổi T&
để T&&
để các nhà xây dựng T's
di chuyển sẽ đá ở (nếu nó tồn tại nếu không ctor sao chép sẽ đóng vai trò của nó trừ khi chúng ta không phải là ctor di chuyển/chuyển nhượng bên ngoài).
khi tôi đã xem xét việc thực hiện có thể có của std::move
nó giống như
template<typename T>
typename remove_reference<T>::type&& move(T&& param)
{
using ReturnType =typename remove_reference<T>::type&&;
return static_cast<ReturnType>(param);
}
Lý do nó sử dụng remove_reference<T>
là vì sự sụp đổ tài liệu tham khảo mà áp dụng trong forward_reference T&&
Tôi chỉ tự hỏi tại sao chúng tôi cần tham khảo về phía trước, chúng tôi không thể thực hiện điều đó bằng cách
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
không thành công.
Và tôi cũng tin rằng danh mục giá trị có nghĩa là cho std::move
là lvalue
với trường hợp này có thể moveInQuestion
có thể tốt hơn std::move
?