Index: base/optional.h |
diff --git a/base/optional.h b/base/optional.h |
index 3adda97c0217ee5c05d8c07a0fbaab062714d03a..a32e06808d82cd7b75b66009880d891e4d62fceb 100644 |
--- a/base/optional.h |
+++ b/base/optional.h |
@@ -34,7 +34,20 @@ namespace internal { |
template <typename T, bool = base::is_trivially_destructible<T>::value> |
struct OptionalStorage { |
- OptionalStorage() {} |
+ constexpr OptionalStorage() {} |
+ |
+ constexpr explicit OptionalStorage(const T& value) |
+ : is_null_(false), value_(value) {} |
+ |
+ // TODO(alshabalin): Can't use 'constexpr' with std::move until C++14. |
+ explicit OptionalStorage(T&& value) |
+ : is_null_(false), value_(std::move(value)) {} |
+ |
+ // TODO(alshabalin): Can't use 'constexpr' with std::forward until C++14. |
+ template <class... Args> |
+ explicit OptionalStorage(base::in_place_t, Args&&... args) |
+ : is_null_(false), value_(std::forward<Args>(args)...) {} |
+ |
// When T is not trivially destructible we must call its |
// destructor before deallocating its memory. |
~OptionalStorage() { |
@@ -54,7 +67,20 @@ struct OptionalStorage { |
template <typename T> |
struct OptionalStorage<T, true> { |
- OptionalStorage() {} |
+ constexpr OptionalStorage() {} |
+ |
+ constexpr explicit OptionalStorage(const T& value) |
+ : is_null_(false), value_(value) {} |
+ |
+ // TODO(alshabalin): Can't use 'constexpr' with std::move until C++14. |
+ explicit OptionalStorage(T&& value) |
+ : is_null_(false), value_(std::move(value)) {} |
+ |
+ // TODO(alshabalin): Can't use 'constexpr' with std::forward until C++14. |
+ template <class... Args> |
+ explicit OptionalStorage(base::in_place_t, Args&&... args) |
+ : is_null_(false), value_(std::forward<Args>(args)...) {} |
+ |
// When T is trivially destructible (i.e. its destructor does nothing) there |
// is no need to call it. Explicitly defaulting the destructor means it's not |
// user-provided. Those two together make this destructor trivial. |
@@ -91,7 +117,8 @@ class Optional { |
using value_type = T; |
constexpr Optional() = default; |
- Optional(base::nullopt_t) : Optional() {} |
+ |
+ constexpr Optional(base::nullopt_t) {} |
Optional(const Optional& other) { |
if (!other.storage_.is_null_) |
@@ -103,14 +130,15 @@ class Optional { |
Init(std::move(other.value())); |
} |
- Optional(const T& value) { Init(value); } |
+ constexpr Optional(const T& value) : storage_(value) {} |
- Optional(T&& value) { Init(std::move(value)); } |
+ // TODO(alshabalin): Can't use 'constexpr' with std::move until C++14. |
+ Optional(T&& value) : storage_(std::move(value)) {} |
+ // TODO(alshabalin): Can't use 'constexpr' with std::forward until C++14. |
template <class... Args> |
- explicit Optional(base::in_place_t, Args&&... args) { |
- emplace(std::forward<Args>(args)...); |
- } |
+ explicit Optional(base::in_place_t, Args&&... args) |
+ : storage_(base::in_place, std::forward<Args>(args)...) {} |
~Optional() = default; |