| 1 | // Structured binding in C++ can bind identifiers to subobjects of an object. |
| 2 | // |
| 3 | // There are three cases we need to test: |
| 4 | // 1) arrays |
| 5 | // 2) tuples like objects |
| 6 | // 3) non-static data members |
| 7 | // |
| 8 | // They can also bind by copy, reference or rvalue reference. |
| 9 | |
| 10 | #include <tuple> |
| 11 | |
| 12 | struct A { |
| 13 | int x; |
| 14 | int y; |
| 15 | }; |
| 16 | |
| 17 | // We want to cover a mix of types and also different sizes to make sure we |
| 18 | // hande the offsets correctly. |
| 19 | struct MixedTypesAndSizesStruct { |
| 20 | A a; |
| 21 | char b1; |
| 22 | char b2; |
| 23 | short b3; |
| 24 | int b4; |
| 25 | char b5; |
| 26 | }; |
| 27 | |
| 28 | int main() { |
| 29 | MixedTypesAndSizesStruct b{.a: {.x: 20, .y: 30}, .b1: 'a', .b2: 'b', .b3: 50, .b4: 60, .b5: 'c'}; |
| 30 | |
| 31 | auto [a1, b1, c1, d1, e1, f1] = b; |
| 32 | auto &[a2, b2, c2, d2, e2, f2] = b; |
| 33 | auto &&[a3, b3, c3, d3, e3, f3] = |
| 34 | MixedTypesAndSizesStruct{.a: {.x: 20, .y: 30}, .b1: 'a', .b2: 'b', .b3: 50, .b4: 60, .b5: 'c'}; |
| 35 | |
| 36 | // Array with different sized types |
| 37 | char carr[]{'a', 'b', 'c'}; |
| 38 | short sarr[]{11, 12, 13}; |
| 39 | int iarr[]{22, 33, 44}; |
| 40 | |
| 41 | auto [carr_copy1, carr_copy2, carr_copy3] = carr; |
| 42 | auto [sarr_copy1, sarr_copy2, sarr_copy3] = sarr; |
| 43 | auto [iarr_copy1, iarr_copy2, iarr_copy3] = iarr; |
| 44 | |
| 45 | auto &[carr_ref1, carr_ref2, carr_ref3] = carr; |
| 46 | auto &[sarr_ref1, sarr_ref2, sarr_ref3] = sarr; |
| 47 | auto &[iarr_ref1, iarr_ref2, iarr_ref3] = iarr; |
| 48 | |
| 49 | auto &&[carr_rref1, carr_rref2, carr_rref3] = carr; |
| 50 | auto &&[sarr_rref1, sarr_rref2, sarr_rref3] = sarr; |
| 51 | auto &&[iarr_rref1, iarr_rref2, iarr_rref3] = iarr; |
| 52 | |
| 53 | float x{4.0}; |
| 54 | char y{'z'}; |
| 55 | int z{10}; |
| 56 | |
| 57 | std::tuple<float, char, int> tpl(x, y, z); |
| 58 | auto [tx1, ty1, tz1] = tpl; |
| 59 | auto &[tx2, ty2, tz2] = tpl; |
| 60 | |
| 61 | return a1.x + b1 + c1 + d1 + e1 + f1 + a2.y + b2 + c2 + d2 + e2 + f2 + a3.x + |
| 62 | b3 + c3 + d3 + e3 + f3 + carr_copy1 + carr_copy2 + carr_copy3 + |
| 63 | sarr_copy1 + sarr_copy2 + sarr_copy3 + iarr_copy1 + iarr_copy2 + |
| 64 | iarr_copy3 + carr_ref1 + carr_ref2 + carr_ref3 + sarr_ref1 + |
| 65 | sarr_ref2 + sarr_ref3 + iarr_ref1 + iarr_ref2 + iarr_ref3 + |
| 66 | carr_rref1 + carr_rref2 + carr_rref3 + sarr_rref1 + sarr_rref2 + |
| 67 | sarr_rref3 + iarr_rref1 + iarr_rref2 + iarr_rref3 + tx1 + ty1 + tz1 + |
| 68 | tx2 + ty2 + tz2; // break here |
| 69 | } |
| 70 | |