Created on 2025-07-15.00:00:00 last changed 1 month ago
Proposed resolution:
This wording is relative to N5014.
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 declarationU u(invoke(std::forward<F>(f), *val ));is well-formed for some invented variable `u`.
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:55 | admin | set | messages: + msg14905 |
2025-07-15 00:00:00 | admin | create |