2017-07-04 13 views
6

Chỉ để xác nhận những gì tôi hiểu về std::movetạ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::movelvalue với trường hợp này có thể moveInQuestion có thể tốt hơn std::move?

Trả lời

8

Ví dụ thông thường là mã chung chung như

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

Với bạn move, điều này phá vỡ khi Tbool, vì trong trường hợp đó x[0] là một tài liệu tham khảo Proxy prvalue chứ không phải là một giá trị trái.

Các vấn đề liên quan