This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of C++23 status.
3843.std::expected<T,E>::value() &
assumes E
is copy constructible
Section: 22.8.6.6 [expected.object.obs] Status: C++23 Submitter: Jonathan Wakely Opened: 2022-12-20 Last modified: 2023-11-22
Priority: Not Prioritized
View all issues with C++23 status.
Discussion:
22.8.6.6 [expected.object.obs] p9 says:
Throws:bad_expected_access(error())
ifhas_value()
isfalse
.
But if error()
returns a reference to a move-only type then it can't be copied and the function body is ill-formed. Should it be constrained with is_copy_constructible_v<E>
? Or just mandate it?
Similarly, the value()&&
and value() const&&
overloads require is_move_constructible_v<E>
to be true for bad_expected_access(std::move(error()))
to be valid. Casey Carter pointed out they also require it to be copyable so that the exception can be thrown, as per 14.2 [except.throw] p5.
[Issaquah 2023-02-09; LWG]
Move to Immediate for C++23
[2023-02-13 Approved at February 2023 meeting in Issaquah. Status changed: Immediate → WP.]
Proposed resolution:
Modify 22.8.6.6 [expected.object.obs] as indicated:
constexpr const T& value() const &; constexpr T& value() &;-?- Mandates:
is_copy_constructible_v<E>
istrue
.-8- Returns:
val
, ifhas_value()
istrue
.-9- Throws:
bad_expected_access( as_const(error() ))
ifhas_value()
isfalse
.constexpr T&& value() &&; constexpr const T&& value() const &&;-?- Mandates:
is_copy_constructible_v<E>
istrue
andis_constructible_v<E, decltype(std::move(error()))>
istrue
.-10- Returns:
std::move(val)
, ifhas_value()
istrue
.-11- Throws:
bad_expected_access(std::move(error()))
ifhas_value()
isfalse
.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4