| // A lightweight class, with pointer-like methods, that contains an int |
| struct X |
| { |
| int i_; |
| |
| constexpr const int &operator*() const { return i_; } |
| constexpr int &operator*() { return i_; } |
| constexpr const int *get() const { return &i_; } |
| constexpr int *get() { return &i_; } |
| constexpr const int *operator->() const { return &i_; } |
| constexpr int *operator->() { return &i_; } |
| |
| constexpr X(int i) : i_(i) {} |
| }; |
| |
| struct XWithImplicitIntStarConversion |
| { |
| int i_; |
| |
| constexpr const int &operator*() const { return i_; } |
| constexpr int &operator*() { return i_; } |
| constexpr const int *get() const { return &i_; } |
| constexpr int *get() { return &i_; } |
| constexpr const int *operator->() const { return &i_; } |
| constexpr int *operator->() { return &i_; } |
| constexpr operator int* () { return &i_; } |
| |
| constexpr XWithImplicitIntStarConversion(int i) : i_(i) {} |
| }; |
| |
| struct XWithImplicitConstIntStarConversion |
| { |
| int i_; |
| |
| constexpr const int &operator*() const { return i_; } |
| constexpr int &operator*() { return i_; } |
| constexpr const int *get() const { return &i_; } |
| constexpr int *get() { return &i_; } |
| constexpr const int *operator->() const { return &i_; } |
| constexpr int *operator->() { return &i_; } |
| constexpr operator const int* () const { return &i_; } |
| |
| constexpr XWithImplicitConstIntStarConversion(int i) : i_(i) {} |
| }; |
| |
| struct ExplicitX |
| { |
| int i_; |
| |
| constexpr const int &operator*() const { return i_; } |
| constexpr int &operator*() { return i_; } |
| constexpr const int *get() const { return &i_; } |
| constexpr int *get() { return &i_; } |
| constexpr const int *operator->() const { return &i_; } |
| constexpr int *operator->() { return &i_; } |
| |
| constexpr explicit ExplicitX(int i) : i_(i) {} |
| }; |
| |
| struct MoveConstructibleFromX |
| { |
| int i_; |
| |
| constexpr const int &operator*() const { return i_; } |
| constexpr int &operator*() { return i_; } |
| constexpr const int *get() const { return &i_; } |
| constexpr int *get() { return &i_; } |
| constexpr const int *operator->() const { return &i_; } |
| constexpr int *operator->() { return &i_; } |
| |
| constexpr MoveConstructibleFromX(int i) : i_(i) {} |
| constexpr MoveConstructibleFromX(X&& x) : i_(x.i_) {} |
| }; |
| |
| struct ExplicitMoveConstructibleFromX |
| { |
| int i_; |
| |
| constexpr const int &operator*() const { return i_; } |
| constexpr int &operator*() { return i_; } |
| constexpr const int *get() const { return &i_; } |
| constexpr int *get() { return &i_; } |
| constexpr const int *operator->() const { return &i_; } |
| constexpr int *operator->() { return &i_; } |
| |
| constexpr ExplicitMoveConstructibleFromX(int i) : i_(i) {} |
| constexpr explicit ExplicitMoveConstructibleFromX(X&& x) : i_(x.i_) {} |
| }; |
| |
| struct CopyConstructibleFromX |
| { |
| int i_; |
| |
| constexpr const int &operator*() const { return i_; } |
| constexpr int &operator*() { return i_; } |
| constexpr const int *get() const { return &i_; } |
| constexpr int *get() { return &i_; } |
| constexpr const int *operator->() const { return &i_; } |
| constexpr int *operator->() { return &i_; } |
| |
| constexpr CopyConstructibleFromX(int i) : i_(i) {} |
| constexpr CopyConstructibleFromX(const X& x) : i_(x.i_) {} |
| }; |
| |
| struct ExplicitCopyConstructibleFromX |
| { |
| int i_; |
| |
| constexpr const int &operator*() const { return i_; } |
| constexpr int &operator*() { return i_; } |
| constexpr const int *get() const { return &i_; } |
| constexpr int *get() { return &i_; } |
| constexpr const int *operator->() const { return &i_; } |
| constexpr int *operator->() { return &i_; } |
| |
| constexpr ExplicitCopyConstructibleFromX(int i) : i_(i) {} |
| constexpr explicit ExplicitCopyConstructibleFromX(const X& x) : i_(x.i_) {} |
| }; |