Title
Excessive unwrapping in std::ref/cref
Status
c++23
Section
[refwrap.helpers]
Submitter
Agustín K-ballo Bergé

Created on 2018-07-10.00:00:00 last changed 4 months ago

Messages

Date: 2021-10-14.09:56:08

Proposed resolution:

This wording is relative to N4885.

  1. Change [refwrap.helpers] as indicated:

    template<class T> constexpr reference_wrapper<T> ref(reference_wrapper<T> t) noexcept;
    

    -3- Returns: ref(t.get())t.

    […]
    template<class T> constexpr reference_wrapper<const T> cref(reference_wrapper<T> t) noexcept;
    

    -5- Returns: cref(t.get())t.

Date: 2021-10-14.00:00:00

[ 2021-10-14 Approved at October 2021 virtual plenary. Status changed: Voting → WP. ]

Date: 2021-08-15.00:00:00

[ 2021-08-20; LWG telecon ]

Set status to Tentatively Ready after telecon review.

Date: 2021-05-22.00:00:00

[ 2021-05-22 Tim syncs wording to the current working draft ]

Date: 2018-08-20.00:00:00

[ 2018-08-20 Priority set to 3 after reflector discussion ]

Date: 2018-07-10.00:00:00

The overloads of std::ref/cref that take a reference_wrapper as argument are defined as calling std::ref/cref recursively, whereas the return type is defined as unwrapping just one level. Calling these functions with arguments of multiple level of wrapping leads to ill-formed programs:

int i = 0;
std::reference_wrapper<int> ri(i);
std::reference_wrapper<std::reference_wrapper<int>> rri(ri);
std::ref(rri); // error within 'std::ref'

[Note: these overloads were added by issue resolution 10.29 for TR1, which can be found at N1688, at Redmond 2004]

History
Date User Action Args
2023-11-22 15:47:43adminsetstatus: wp -> c++23
2021-10-14 09:56:08adminsetmessages: + msg12112
2021-10-14 09:56:08adminsetstatus: voting -> wp
2021-09-29 12:57:28adminsetstatus: ready -> voting
2021-08-20 17:21:40adminsetmessages: + msg12009
2021-08-20 17:21:40adminsetstatus: new -> ready
2021-05-22 14:52:08adminsetmessages: + msg11837
2018-08-22 12:55:05adminsetmessages: + msg10097
2018-07-30 20:47:23adminsetmessages: + msg10050
2018-07-10 00:00:00admincreate