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++
và 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
?
lực lượng bí danh của bạn bản cho rvalues, thay vì di chuyển. – Xeo
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