diff options
Diffstat (limited to 'absl/types/optional.h')
-rw-r--r-- | absl/types/optional.h | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/absl/types/optional.h b/absl/types/optional.h index ef8255915746..9858a9749766 100644 --- a/absl/types/optional.h +++ b/absl/types/optional.h @@ -849,12 +849,20 @@ class optional : private optional_internal::optional_data<T>, // is empty. template <typename U> constexpr T value_or(U&& v) const& { + static_assert(std::is_copy_constructible<value_type>::value, + "optional<T>::value_or: T must by copy constructible"); + static_assert(std::is_convertible<U&&, value_type>::value, + "optional<T>::value_or: U must be convertible to T"); return static_cast<bool>(*this) ? **this : static_cast<T>(absl::forward<U>(v)); } template <typename U> T value_or(U&& v) && { // NOLINT(build/c++11) + static_assert(std::is_move_constructible<value_type>::value, + "optional<T>::value_or: T must by copy constructible"); + static_assert(std::is_convertible<U&&, value_type>::value, + "optional<T>::value_or: U must be convertible to T"); return static_cast<bool>(*this) ? std::move(**this) : static_cast<T>(std::forward<U>(v)); } |