Changes imported from Abseil "staging" branch:

- d7810aa3eadf258776b9c4914df3b3db68791829 absl::optional<T>::value_or(U) now enforces copy/move by Matt Armstrong <marmstrong@google.com>
  - 3cc15e447c1851a91dd88e537e5f74faece605a3 Use ABSL_EXCEPTIONS_FLAG instead of -fexceptions in absl/... by Jon Cohen <cohenjon@google.com>

GitOrigin-RevId: d7810aa3eadf258776b9c4914df3b3db68791829
Change-Id: Ib40e22678944b633e734af790449871630f0eeab
pull/83/head
Abseil Team 7 years ago committed by John Olson
parent 787891a388
commit dcf112f074
  1. 5
      absl/container/BUILD.bazel
  2. 8
      absl/types/optional.h

@ -18,6 +18,7 @@ load(
"//absl:copts.bzl", "//absl:copts.bzl",
"ABSL_DEFAULT_COPTS", "ABSL_DEFAULT_COPTS",
"ABSL_TEST_COPTS", "ABSL_TEST_COPTS",
"ABSL_EXCEPTIONS_FLAG",
) )
package(default_visibility = ["//visibility:public"]) package(default_visibility = ["//visibility:public"])
@ -40,7 +41,7 @@ cc_library(
cc_test( cc_test(
name = "fixed_array_test", name = "fixed_array_test",
srcs = ["fixed_array_test.cc"], srcs = ["fixed_array_test.cc"],
copts = ABSL_TEST_COPTS + ["-fexceptions"], copts = ABSL_TEST_COPTS + ABSL_EXCEPTIONS_FLAG,
deps = [ deps = [
":fixed_array", ":fixed_array",
"//absl/base:exception_testing", "//absl/base:exception_testing",
@ -76,7 +77,7 @@ cc_library(
cc_test( cc_test(
name = "inlined_vector_test", name = "inlined_vector_test",
srcs = ["inlined_vector_test.cc"], srcs = ["inlined_vector_test.cc"],
copts = ABSL_TEST_COPTS + ["-fexceptions"], copts = ABSL_TEST_COPTS + ABSL_EXCEPTIONS_FLAG,
deps = [ deps = [
":inlined_vector", ":inlined_vector",
":test_instance_tracker", ":test_instance_tracker",

@ -849,12 +849,20 @@ class optional : private optional_internal::optional_data<T>,
// is empty. // is empty.
template <typename U> template <typename U>
constexpr T value_or(U&& v) const& { 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) return static_cast<bool>(*this)
? **this ? **this
: static_cast<T>(absl::forward<U>(v)); : static_cast<T>(absl::forward<U>(v));
} }
template <typename U> template <typename U>
T value_or(U&& v) && { // NOLINT(build/c++11) 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) return static_cast<bool>(*this) ? std::move(**this)
: static_cast<T>(std::forward<U>(v)); : static_cast<T>(std::forward<U>(v));
} }

Loading…
Cancel
Save