This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of Resolved status.

### 2825. LWG 2756 breaks class template argument deduction for `optional`

Section: 22.5.3 [optional.optional] Status: Resolved Submitter: Richard Smith Opened: 2016-11-24 Last modified: 2020-11-09

Priority: 2

View all other issues in [optional.optional].

View all issues with Resolved status.

Discussion:

LWG 2756 applies these changes:

>     constexpr optional(const T&);
>     constexpr optional(T&&);
>     template <class... Args> constexpr explicit optional(in_place_t, Args&&...);
>     template <class U, class... Args>
>       constexpr explicit optional(in_place_t, initializer_list<U>, Args&&...);
>     template <class U = T> EXPLICIT constexpr optional(U&&);
>     template <class U> EXPLICIT optional(const optional<U>&);
>     template <class U> EXPLICIT optional(optional<U>&&);

These break the ability for `optional` to perform class template argument deduction, as there is now no way to map from `optional`'s argument to the template parameter `T`.

[2017-01-27 Telecon]

Priority 2

[2017-01-30 Ville comments:]

Seems like the problem is resolved by a simple deduction guide:

    template <class T> optional(T) -> optional<T>;

The paper p0433r0 seems to suggest a different guide,

    template<class T> optional(T&& t) -> optional<remove_reference_t<T>>;

but I don't think the paper is up to speed with LWG 2756. There's no reason to use such an universal reference in the guide and `remove_reference` in its target, just guide with `T`, with the target `optional<T>`, `optional`'s constructors do the right thing once the type has been deduced.

[2020-05-29; Billy Baker comments]

At Kona 2017, P0433R2 was accepted and added Ville's deduction guide rather than one proposed in P0433R0.

[2020-11-09 Resolved for C++20. Status changed: Tentatively Resolved → Resolved.]

Rationale:

Resolved by P0433R2.

Proposed resolution: