Để làm rõ khái niệm cốt lõi, chúng ta hãy giảm nó thành một ví dụ cơ bản hơn. Mặc dù std::tie
rất hữu ích cho các hàm trả về (nhiều) giá trị hơn, nhưng chúng ta có thể hiểu nó tốt chỉ với 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 biết để tiếp tục:
Bước tiếp theo là loại bỏ những hàm chỉ cản trở bạn, vì vậy chúng tôi có thể chuyển đổi mã của mình thành như sau:
int a;
std::tuple<int&>{a} = std::tuple<int>{24};
return a; // 24
Bước tiếp theo là xem chính xác điều gì xảy ra bên trong các 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&>
, được loại bỏ đến mức tối thiểu nhất 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 loại bỏ tất cả các cấu trúc cùng nhau (tốt, nó không tương đương 100%, nhưng nó đủ gần với chúng tôi và đủ rõ ràng để cho phép nó):
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 tham chiếu thành viên dữ liệu tới a
. std::tuple<int>(24)
tạo một thành viên dữ liệu có giá trị 24
và phép 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à một tham chiếu bị ràng buộc a
, về cơ bản điều đó sẽ gán 24
cho a
.