summaryrefslogtreecommitdiff
path: root/absl/types/optional.h
diff options
context:
space:
mode:
Diffstat (limited to 'absl/types/optional.h')
-rw-r--r--absl/types/optional.h12
1 files changed, 7 insertions, 5 deletions
diff --git a/absl/types/optional.h b/absl/types/optional.h
index 581321dc..98b29e59 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.