diff options
Diffstat (limited to 'absl/types/optional.h')
-rw-r--r-- | absl/types/optional.h | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/absl/types/optional.h b/absl/types/optional.h index 581321dc37a1..98b29e591d15 100644 --- a/absl/types/optional.h +++ b/absl/types/optional.h @@ -774,7 +774,9 @@ class optional : private optional_internal::optional_data<T>, // // Accesses the underlying `T` value's member `m` of an `optional`. If the // `optional` is empty, behavior is undefined. - constexpr const T* operator->() const { return this->pointer(); } + // + // If you need myOpt->foo in constexpr, use (*myOpt).foo instead. + const T* operator->() const { return this->pointer(); } T* operator->() { assert(this->engaged_); return this->pointer(); @@ -870,12 +872,12 @@ class optional : private optional_internal::optional_data<T>, private: // Private accessors for internal storage viewed as pointer to T. - constexpr const T* pointer() const { return &this->data_; } - T* pointer() { return &this->data_; } + const T* pointer() const { return std::addressof(this->data_); } + T* pointer() { return std::addressof(this->data_); } // Private accessors for internal storage viewed as reference to T. - constexpr const T& reference() const { return *this->pointer(); } - T& reference() { return *(this->pointer()); } + constexpr const T& reference() const { return this->data_; } + T& reference() { return this->data_; } // T constraint checks. You can't have an optional of nullopt_t, in_place_t // or a reference. |