3940. std::expected<void, E>::value() also needs E to be copy constructible

Section: [expected.void.obs] Status: WP Submitter: Jiang An Opened: 2023-05-26 Last modified: 2023-11-22 16:02:05 UTC

Priority: Not Prioritized

View all issues with WP status.


LWG 3843 added Mandates: to std::expected::value, but the similar handling is missing for expected<cv void, E>.

[2023-06-01; Reflector poll]

Set status to Tentatively Ready after seven votes in favour during reflector poll.

[2023-06-17 Approved at June 2023 meeting in Varna. Status changed: Voting → WP.]

Proposed resolution:

This wording is relative to N4950.

  1. Modify [expected.void.obs] as indicated:

    constexpr void value() const &;

    -?- Mandates: is_copy_constructible_v<E> is true.

    -3- Throws: bad_expected_access(error()) if has_value() is false.

    constexpr void value() &&;

    -?- Mandates: is_copy_constructible_v<E> is true and is_move_constructible_v<E> is true.

    -4- Throws: bad_expected_access(std::move(error())) if has_value() is false.