[libcxx-commits] [libcxx] [libc++][NFC] Add optional<T&> synopsis (PR #170043)
via libcxx-commits
libcxx-commits at lists.llvm.org
Sun Nov 30 10:10:19 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-libcxx
Author: William Tran-Viet (smallp-o-p)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/170043.diff
1 Files Affected:
- (modified) libcxx/include/optional (+65)
``````````diff
diff --git a/libcxx/include/optional b/libcxx/include/optional
index 23b21364b1a79..7b979d3d6d577 100644
--- a/libcxx/include/optional
+++ b/libcxx/include/optional
@@ -186,6 +186,71 @@ namespace std {
template<class T>
optional(T) -> optional<T>;
+ template<class T>
+ class optional<T&> { // since C++26
+ public:
+ using value_type = T;
+ using iterator = implementation-defined; // see [optional.ref.iterators]
+
+ public:
+ // [optional.ref.ctor], constructors
+ constexpr optional() noexcept = default;
+ constexpr optional(nullopt_t) noexcept : optional() {}
+ constexpr optional(const optional& rhs) noexcept = default;
+
+ template<class Arg>
+ constexpr explicit optional(in_place_t, Arg&& arg);
+ template<class U>
+ constexpr explicit(see below) optional(U&& u) noexcept(see below);
+ template<class U>
+ constexpr explicit(see below) optional(optional<U>& rhs) noexcept(see below);
+ template<class U>
+ constexpr explicit(see below) optional(const optional<U>& rhs) noexcept(see below);
+ template<class U>
+ constexpr explicit(see below) optional(optional<U>&& rhs) noexcept(see below);
+ template<class U>
+ constexpr explicit(see below) optional(const optional<U>&& rhs) noexcept(see below);
+
+ constexpr ~optional() = default;
+
+ // [optional.ref.assign], assignment
+ constexpr optional& operator=(nullopt_t) noexcept;
+ constexpr optional& operator=(const optional& rhs) noexcept = default;
+
+ template<class U> constexpr T& emplace(U&& u) noexcept(see below);
+
+ // [optional.ref.swap], swap
+ constexpr void swap(optional& rhs) noexcept;
+
+ // [optional.ref.iterators], iterator support
+ constexpr iterator begin() const noexcept;
+ constexpr iterator end() const noexcept;
+
+ // [optional.ref.observe], observers
+ constexpr T* operator->() const noexcept;
+ constexpr T& operator*() const noexcept;
+ constexpr explicit operator bool() const noexcept;
+ constexpr bool has_value() const noexcept;
+ constexpr T& value() const; // freestanding-deleted
+ template<class U = remove_cv_t<T>>
+ constexpr remove_cv_t<T> value_or(U&& u) const;
+
+ // [optional.ref.monadic], monadic operations
+ template<class F> constexpr auto and_then(F&& f) const;
+ template<class F> constexpr optional<invoke_result_t<F, T&>> transform(F&& f) const;
+ template<class F> constexpr optional or_else(F&& f) const;
+
+ // [optional.ref.mod], modifiers
+ constexpr void reset() noexcept;
+
+ private:
+ T* val = nullptr; // exposition only
+
+ // [optional.ref.expos], exposition only helper functions
+ template<class U>
+ constexpr void convert-ref-init-val(U&& u); // exposition only
+ };
+
} // namespace std
*/
``````````
</details>
https://github.com/llvm/llvm-project/pull/170043
More information about the libcxx-commits
mailing list