Title
Missing Mandates: part in optional<T&>::transform
Status
new
Section
[optional.ref.monadic]
Submitter
Giuseppe D'Angelo

Created on 2025-07-15.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.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`.

Date: 2025-07-15.00:00:00

In [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 [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.

History
Date User Action Args
2025-07-26 15:45:55adminsetmessages: + msg14905
2025-07-15 00:00:00admincreate