Để làm rõ khái niệm cốt lõi, hãy giảm khái niệm đó thành ví dụ cơ bản hơn. Mặc dù std::tie
rất hữu ích cho các chức năng trở về (một tuple của) nhiều giá trị, chúng ta có thể hiểu nó chỉ tốt với chỉ một giá trị:
int a;
std::tie(a) = std::make_tuple(24);
return a; // 24
Những điều chúng ta cần phải biết để đi tiếp:
Bước tiếp theo là để thoát khỏi những chức năng mà chỉ nhận được theo cách của bạn, vì vậy chúng tôi có thể chuyển đổi mã của chúng tôi như thế này:
int a;
std::tuple<int&>{a} = std::tuple<int>{24};
return a; // 24
Bước tiếp theo là để xem chính xác những gì xảy ra bên trong những cấu trúc đó. Đối với điều này, tôi tạo ra 2 loại T
nhóm thế cho std::tuple<int>
và Tr
nhóm thế std::tuple<int&>
, tước xuống đến mức tối thiểu cho các hoạt động của chúng tôi:
struct T { // substituent for std::tuple<int>
int x;
};
struct Tr { // substituent for std::tuple<int&>
int& xr;
auto operator=(const T& other)
{
// std::get<I>(*this) = std::get<I>(other);
xr = other.x;
}
};
auto foo()
{
int a;
Tr{a} = T{24};
return a; // 24
}
Và cuối cùng, tôi muốn thoát khỏi các cấu trúc tất cả cùng nhau (tốt, nó không phải là 100% tương đương, nhưng nó đủ gần cho chúng ta, và đủ để cho phép nó rõ ràng):
auto foo()
{
int a;
{ // block substituent for temporary variables
// Tr{a}
int& tr_xr = a;
// T{24}
int t_x = 24;
// = (asignement)
tr_xr = t_x;
}
return a; // 24
}
vì vậy, về cơ bản, std::tie(a)
khởi tạo một tài liệu tham khảo thành viên dữ liệu để a
. std::tuple<int>(24)
tạo thành viên dữ liệu có giá trị 24
và gán gán gán 24 cho tham chiếu thành viên dữ liệu trong cấu trúc đầu tiên. Nhưng vì thành viên dữ liệu đó là tham chiếu được ràng buộc với a
, về cơ bản chỉ định 24
đến a
.
Nếu đó dòng cuối cùng biên dịch Tôi là một chút lo lắng. Có vẻ như ràng buộc một tham chiếu đến một tạm thời là bất hợp pháp. –
@NirFriedman Bạn không nhận được gia hạn trọn đời trong trường hợp đó? – Neil
@Neil Nó phải là tham chiếu rvalue hoặc tham chiếu const lvalue. Bạn không thể liên kết tham chiếu lvalue với giá trị prvalue (tạm thời). Mặc dù điều này đã được một "phần mở rộng" trong MSVC cho lứa tuổi. –