123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- // 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_) {}
- };
|