This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of New status.

4299. Missing Mandates: part in optional<T&>::transform

Section: 22.5.4.7 [optional.ref.monadic] Status: New Submitter: Giuseppe D'Angelo Opened: 2025-07-15 Last modified: 2025-07-27

Priority: Not Prioritized

View all issues with New status.

Discussion:

In 22.5.4.7 [optional.ref.monadic] the specification of optional<T&>::transform is missing an additional part of the Mandates: element compared to the primary template's transform (in 22.5.3.8 [optional.monadic] p8); that is, is missing to enforce that the U type is a valid contained type for optional.

The definition of "valid contained type" comes from P2988R12. The paper amended the Mandates: element of the primary template's transform to use this definition. The fact that the same wording has not been applied to optional<T&>::transform as well looks like an oversight. I would suggest to apply it.

Proposed resolution:

This wording is relative to this CD preview draft.

  1. Modify 22.5.4.7 [optional.ref.monadic] as indicated:

    template<class F>
      constexpr optional<remove_cv_t<invoke_result_t<F, T&>>> transform(F&& f) const;
    

    -4- Let U be remove_cv_t<invoke_result_t<F, T&>>.

    -5- Mandates: U is a valid contained type for optional. The declaration

    U u(invoke(std::forward<F>(f), *val ));
    

    is well-formed for some invented variable u.