Tôi đang viết thư viện mạng và sử dụng nhiều ngữ nghĩa di chuyển để xử lý quyền sở hữu đối với các bộ mô tả tệp. Một trong những lớp học của tôi rất mong nhận được giấy gói mô tả tập tin các loại khác và mất quyền sở hữu, vì vậy nó là cái gì nhưLàm thế nào để tạo tham số tham chiếu rvalue mẫu CHỈ liên kết với tham chiếu rvalue?
struct OwnershipReceiver
{
template <typename T>
void receive_ownership(T&& t)
{
// taking file descriptor of t, and clear t
}
};
Nó có để đối phó nhiều loại không liên quan nên receive_ownership có phải là một mẫu, và để an toàn, tôi muốn nó CHỈ liên kết với các tham chiếu rvalue, do đó người dùng phải khai báo rõ ràng std :: move khi truyền một giá trị.
receive_ownership(std::move(some_lvalue));
Nhưng vấn đề là: C++ template khấu trừ cho phép một giá trị trái để được thông qua trong mà không cần nỗ lực nhiều. Và tôi thực sự tự bắn vào chân một lần bằng cách vô tình chuyển một lvalue để receive_ownership và sử dụng lvalue (xóa) sau này.
Vì vậy, đây là câu hỏi: làm cách nào để tạo mẫu CHỈ liên kết với tham chiếu rvalue?
Bạn có thể sử dụng 'std: : is_rvalue_reference' thay vì – David
Cảm ơn Howard, điều đó hoạt động tốt. Và Dave, tôi nghĩ chính xác giống như bạn làm lúc đầu, sau đó tôi thấy std :: is_rvalue_reference sẽ không hoạt động: nó không liên kết với một giá trị "thực", hoặc thậm chí std :: move() ed lvalue . –
@Ralph: Bạn đã thử 'is_rvalue_reference :: value'? (Lưu ý '&&') –
fredoverflow