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{{20, 30}, 'a', 'b', 50, 60, '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{{20, 30}, 'a', 'b', 50, 60, '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