119 lines · c
1 // A lightweight class, with pointer-like methods, that contains an int2struct X3{4 int i_;5 6 constexpr const int &operator*() const { return i_; }7 constexpr int &operator*() { return i_; }8 constexpr const int *get() const { return &i_; }9 constexpr int *get() { return &i_; }10 constexpr const int *operator->() const { return &i_; }11 constexpr int *operator->() { return &i_; }12 13 constexpr X(int i) : i_(i) {}14};15 16struct XWithImplicitIntStarConversion17{18 int i_;19 20 constexpr const int &operator*() const { return i_; }21 constexpr int &operator*() { return i_; }22 constexpr const int *get() const { return &i_; }23 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 28 constexpr XWithImplicitIntStarConversion(int i) : i_(i) {}29};30 31struct XWithImplicitConstIntStarConversion32{33 int i_;34 35 constexpr const int &operator*() const { return i_; }36 constexpr int &operator*() { return i_; }37 constexpr const int *get() const { return &i_; }38 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 43 constexpr XWithImplicitConstIntStarConversion(int i) : i_(i) {}44};45 46struct ExplicitX47{48 int i_;49 50 constexpr const int &operator*() const { return i_; }51 constexpr int &operator*() { return i_; }52 constexpr const int *get() const { return &i_; }53 constexpr int *get() { return &i_; }54 constexpr const int *operator->() const { return &i_; }55 constexpr int *operator->() { return &i_; }56 57 constexpr explicit ExplicitX(int i) : i_(i) {}58};59 60struct MoveConstructibleFromX61{62 int i_;63 64 constexpr const int &operator*() const { return i_; }65 constexpr int &operator*() { return i_; }66 constexpr const int *get() const { return &i_; }67 constexpr int *get() { return &i_; }68 constexpr const int *operator->() const { return &i_; }69 constexpr int *operator->() { return &i_; }70 71 constexpr MoveConstructibleFromX(int i) : i_(i) {}72 constexpr MoveConstructibleFromX(X&& x) : i_(x.i_) {}73};74 75struct ExplicitMoveConstructibleFromX76{77 int i_;78 79 constexpr const int &operator*() const { return i_; }80 constexpr int &operator*() { return i_; }81 constexpr const int *get() const { return &i_; }82 constexpr int *get() { return &i_; }83 constexpr const int *operator->() const { return &i_; }84 constexpr int *operator->() { return &i_; }85 86 constexpr ExplicitMoveConstructibleFromX(int i) : i_(i) {}87 constexpr explicit ExplicitMoveConstructibleFromX(X&& x) : i_(x.i_) {}88};89 90struct CopyConstructibleFromX91{92 int i_;93 94 constexpr const int &operator*() const { return i_; }95 constexpr int &operator*() { return i_; }96 constexpr const int *get() const { return &i_; }97 constexpr int *get() { return &i_; }98 constexpr const int *operator->() const { return &i_; }99 constexpr int *operator->() { return &i_; }100 101 constexpr CopyConstructibleFromX(int i) : i_(i) {}102 constexpr CopyConstructibleFromX(const X& x) : i_(x.i_) {}103};104 105struct ExplicitCopyConstructibleFromX106{107 int i_;108 109 constexpr const int &operator*() const { return i_; }110 constexpr int &operator*() { return i_; }111 constexpr const int *get() const { return &i_; }112 constexpr int *get() { return &i_; }113 constexpr const int *operator->() const { return &i_; }114 constexpr int *operator->() { return &i_; }115 116 constexpr ExplicitCopyConstructibleFromX(int i) : i_(i) {}117 constexpr explicit ExplicitCopyConstructibleFromX(const X& x) : i_(x.i_) {}118};119