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.
Section: 22.5.4 [optional.nullopt] Status: New Submitter: Frank Birbacher Opened: 2021-10-01 Last modified: 2021-10-14
Priority: 3
View all other issues in [optional.nullopt].
View all issues with New status.
Discussion:
The Standard defines a number of types that are used to create overload disambiguators for constructors, like nullopt_t and allocator_tag_t. Values of such types are passed by value to such constructors to give it particular meaning. For pass-by-value these types need to be copy-constructible and for consistency should also be copy-assignable. Of those types the specification of nullopt_t doesn't clearly state that the type is copyable, 22.5.4 [optional.nullopt].
The reason that nullopt_t is defined differently from other such types is to avoid ambiguity in expressions that assign an empty brace initializer to an optional.[2021-10-14; Reflector poll]
Set priority to 3 after reflector poll.
[Daniel commented:]
I would prefer to see the wording use
is_trivially_copy_constructible_v
and trivially_copy_assignable_v
,
which is consistent with similar usage of trivial-requirements in
std::optional
.
[Tim commented:]
We need to say that it models copyable and is trivially copyable
(not sure if we need the latter but might as well - does anyone do it differently?).
"has a copy constructor" isn't enough - T(T&)
is a copy constructor.
Proposed resolution:
This wording is relative to N4892.
Modify 22.5.4 [optional.nullopt] as indicated:
struct nullopt_t{see below}; inline constexpr nullopt_t nullopt(unspecified);-1- The struct nullopt_t is an empty class type used as a unique type to indicate the state of not containing a value for optional objects. In particular, optional<T> has a constructor with nullopt_t as a single argument; this indicates that an optional object not containing a value shall be constructed.
-2- Type nullopt_t shall not have a default constructor or an initializer-list constructor,andshall not be an aggregate, and shall have a copy constructor and a copy assignment operator, both shall be public and trivial.