2014-09-18 25 views
5

Tôi đã tạo một bí danh std::forward sẽ hoạt động chính xác như std::forward.Tạo bí danh `std :: forward` - kết quả không mong muốn

template<class T> 
constexpr decltype(auto) fwd(T mValue) noexcept 
{ 
    return std::forward<T>(mValue); 
} 

Sau đó, tôi đã thay thế tất cả các lần xuất hiện std::forward<...> bằng fwd<...> bằng mã số của tôi.

Biên soạn tất cả các dự án với g++ 4.9 - tất cả các thử nghiệm được thông qua, mọi thứ hoạt động bình thường.

Sau đó, tôi đã thử biên dịch với clang++ 3.5. Một số thử nghiệm dường như thất bại ngẫu nhiên, và lý do là fwd<...>. Thay thế nó bằng std::forward<...> một lần nữa cố định các thử nghiệm không thành công.

Tôi cố gắng viết fwd<...> với kiểu cú pháp dấu sự trở lại, như tôi nghĩ decltype(auto) không hoạt động:

template<class T> 
constexpr auto fwd(T mValue) noexcept -> decltype(std::forward<T>(mValue)) 
{ 
    return std::forward<T>(mValue); 
} 

kết quả tương tự: g++ công trình, clang++ không.

sau đó tôi nhìn lên chữ ký của std::forward trên cppreference, và thực hiện bí danh của tôi như thế này:

template<class T> 
constexpr T&& fwd(std::remove_reference_t<T>& t) { return std::forward<T>(t); } 

template<class T> 
constexpr T&& fwd(std::remove_reference_t<T>&& t) { return std::forward<T>(t); } 

này hoạt động (tất cả đều pass) cả trên g++clang++.

Tại sao phiên bản decltype(auto) không hoạt động? Không nên trả về chính xác loại trả về giống như std::forward?

+3

lực lượng bí danh của bạn bản cho rvalues, thay vì di chuyển. – Xeo

+2

bạn đã thử sử dụng 'auto' hoặc' decltype (auto) 'trong hai lần triển khai cuối cùng trong khi vẫn duy trì' std :: remove_reference_t' trong đối số? – iFreilicht

Trả lời

2

Bạn quên tuyên bố mValue như một tài liệu tham khảo di chuyển

template <typename T> 
constexpr decltype(auto) fwd(std::remove_reference_t<T> &&mValue) 
{ 
    return std::forward<T>(mValue); 
} 
template <typename T> 
constexpr decltype(auto) fwd(std::remove_reference_t<T> &mValue) 
{ 
    return std::forward<T>(mValue); 
} 
+1

Tôi không chắc chắn nếu 'fwd (T && mValue)' sẽ hoạt động nếu 'T' là' Loại & 'hoặc' Loại && ' – programmerjake

+1

Lưu ý rằng phiên bản có tham chiếu giá trị l cũng cần thiết nếu không bạn gặp lỗi biên dịch: (http://coliru.stacked-crooked.com/a/3505f7b8b37980e2) – Jarod42

+0

@ Jarod42 sửa nó, cảm ơn – programmerjake

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