Trong tiêu chuẩn C++ 11 nó nói rằng (xem cppreference.com, xem thêm phần 20.4.2.4 của tiêu chuẩn) nó nói rằngTại sao std :: make_tuple turn std :: reference_wrapper <X> đối số vào X &?
template< class... Types >
tuple<VTypes...> make_tuple(Types&&... args);
Tạo một đối tượng tuple, suy diễn ra kiểu mục tiêu từ các loại của các đối số.
Đối với mỗi
Ti
trongTypes...
, tương ứng loạiVi
trongVtypes...
làstd::decay<Ti>::type
trừ khi áp dụngstd::decay
kết quả trongstd::reference_wrapper<X>
đối với một số loạiX
, trong trường hợp này loại suy luận làX&
.
Tôi tự hỏi: Tại sao trình bao bọc tham chiếu được xử lý đặc biệt ở đây?
Tôi nghĩ điểm chính là 'std :: reference_wrapper' là điểm đánh dấu thông thường (được xử lý đặc biệt) cần thiết trước khi tham chiếu rvalue, xem http://stackoverflow.com/questions/20080493/semantics-for-wrapped-objects -reference-value-by-default-via-stdmove-stdref? rq = 1. Tôi nghĩ rằng nó cần thiết nữa trong C++ 11 nhưng quy ước vẫn tồn tại. – alfC