Title
std::optional<NonReturnable&> is ill-formed due to `value_or`
Status
new
Section
[optional.ref.observe]
Submitter
Jiang An

Created on 2025-07-25.00:00:00 last changed 1 month ago

Messages

Date: 2025-08-16.09:29:49

Proposed resolution:

This wording is relative to N5014.

  1. Modify [optional.optional.ref.general], header <iterator> synopsis, as indicated:

    namespace std {
      template<class T>
      class optional<T&> {
        […]
        constexpr T& value() const; // freestanding-deleted
        template<class U = remove_cv_t<T>>
          constexpr remove_cv_t<T> value_or(U&& u) const; // not always present
        […]
      };
    }
    
  2. Modify [optional.ref.observe] as indicated:

    template<class U = remove_cv_t<T>> constexpr remove_cv_t<T> value_or(U&& u) const;
    

    -8- Let `X` be remove_cv_t<T>.

    -9- Mandates: is_constructible_v<X, T&> && is_convertible_v<U, X> is `true`.

    -10- Effects: Equivalent to:

    return has_value() ? *val : static_cast<X>(std::forward<U>(u));
    

    -?- Remarks: This function template is present if and only if `T` is a non-array object type.

Date: 2025-07-25.00:00:00

Currently, if `T` is an array type or a function type, instantiation of std::optional<T&> is still ill-formed, because the return type of its `value_or` member function is specified as remove_cv_t<T>, which is invalid as a return type.

However, we don't exclude such T& from valid contained types. Given only `value_or` is problematic here, perhaps we can avoid providing it if `T` is not returnable.

History
Date User Action Args
2025-07-27 09:18:00adminsetmessages: + msg14916
2025-07-25 00:00:00admincreate