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