1 // A lightweight class, with pointer-like methods, that contains an int 2 struct X 3 { 4 int i_; 5 6 constexpr const int &operator*() const { return i_; } 7 constexpr int &operator*() { return i_; } getX8 constexpr const int *get() const { return &i_; } getX9 constexpr int *get() { return &i_; } 10 constexpr const int *operator->() const { return &i_; } 11 constexpr int *operator->() { return &i_; } 12 XX13 constexpr X(int i) : i_(i) {} 14 }; 15 16 struct XWithImplicitIntStarConversion 17 { 18 int i_; 19 20 constexpr const int &operator*() const { return i_; } 21 constexpr int &operator*() { return i_; } getXWithImplicitIntStarConversion22 constexpr const int *get() const { return &i_; } getXWithImplicitIntStarConversion23 constexpr int *get() { return &i_; } 24 constexpr const int *operator->() const { return &i_; } 25 constexpr int *operator->() { return &i_; } 26 constexpr operator int* () { return &i_; } 27 XWithImplicitIntStarConversionXWithImplicitIntStarConversion28 constexpr XWithImplicitIntStarConversion(int i) : i_(i) {} 29 }; 30 31 struct XWithImplicitConstIntStarConversion 32 { 33 int i_; 34 35 constexpr const int &operator*() const { return i_; } 36 constexpr int &operator*() { return i_; } getXWithImplicitConstIntStarConversion37 constexpr const int *get() const { return &i_; } getXWithImplicitConstIntStarConversion38 constexpr int *get() { return &i_; } 39 constexpr const int *operator->() const { return &i_; } 40 constexpr int *operator->() { return &i_; } 41 constexpr operator const int* () const { return &i_; } 42 XWithImplicitConstIntStarConversionXWithImplicitConstIntStarConversion43 constexpr XWithImplicitConstIntStarConversion(int i) : i_(i) {} 44 }; 45 46 struct ExplicitX 47 { 48 int i_; 49 50 constexpr const int &operator*() const { return i_; } 51 constexpr int &operator*() { return i_; } getExplicitX52 constexpr const int *get() const { return &i_; } getExplicitX53 constexpr int *get() { return &i_; } 54 constexpr const int *operator->() const { return &i_; } 55 constexpr int *operator->() { return &i_; } 56 ExplicitXExplicitX57 constexpr explicit ExplicitX(int i) : i_(i) {} 58 }; 59 60 struct MoveConstructibleFromX 61 { 62 int i_; 63 64 constexpr const int &operator*() const { return i_; } 65 constexpr int &operator*() { return i_; } getMoveConstructibleFromX66 constexpr const int *get() const { return &i_; } getMoveConstructibleFromX67 constexpr int *get() { return &i_; } 68 constexpr const int *operator->() const { return &i_; } 69 constexpr int *operator->() { return &i_; } 70 MoveConstructibleFromXMoveConstructibleFromX71 constexpr MoveConstructibleFromX(int i) : i_(i) {} MoveConstructibleFromXMoveConstructibleFromX72 constexpr MoveConstructibleFromX(X&& x) : i_(x.i_) {} 73 }; 74 75 struct ExplicitMoveConstructibleFromX 76 { 77 int i_; 78 79 constexpr const int &operator*() const { return i_; } 80 constexpr int &operator*() { return i_; } getExplicitMoveConstructibleFromX81 constexpr const int *get() const { return &i_; } getExplicitMoveConstructibleFromX82 constexpr int *get() { return &i_; } 83 constexpr const int *operator->() const { return &i_; } 84 constexpr int *operator->() { return &i_; } 85 ExplicitMoveConstructibleFromXExplicitMoveConstructibleFromX86 constexpr ExplicitMoveConstructibleFromX(int i) : i_(i) {} ExplicitMoveConstructibleFromXExplicitMoveConstructibleFromX87 constexpr explicit ExplicitMoveConstructibleFromX(X&& x) : i_(x.i_) {} 88 }; 89 90 struct CopyConstructibleFromX 91 { 92 int i_; 93 94 constexpr const int &operator*() const { return i_; } 95 constexpr int &operator*() { return i_; } getCopyConstructibleFromX96 constexpr const int *get() const { return &i_; } getCopyConstructibleFromX97 constexpr int *get() { return &i_; } 98 constexpr const int *operator->() const { return &i_; } 99 constexpr int *operator->() { return &i_; } 100 CopyConstructibleFromXCopyConstructibleFromX101 constexpr CopyConstructibleFromX(int i) : i_(i) {} CopyConstructibleFromXCopyConstructibleFromX102 constexpr CopyConstructibleFromX(const X& x) : i_(x.i_) {} 103 }; 104 105 struct ExplicitCopyConstructibleFromX 106 { 107 int i_; 108 109 constexpr const int &operator*() const { return i_; } 110 constexpr int &operator*() { return i_; } getExplicitCopyConstructibleFromX111 constexpr const int *get() const { return &i_; } getExplicitCopyConstructibleFromX112 constexpr int *get() { return &i_; } 113 constexpr const int *operator->() const { return &i_; } 114 constexpr int *operator->() { return &i_; } 115 ExplicitCopyConstructibleFromXExplicitCopyConstructibleFromX116 constexpr ExplicitCopyConstructibleFromX(int i) : i_(i) {} ExplicitCopyConstructibleFromXExplicitCopyConstructibleFromX117 constexpr explicit ExplicitCopyConstructibleFromX(const X& x) : i_(x.i_) {} 118 }; 119