This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of C++11 status.
Section: 22.10.6.2 [refwrap.const] Status: C++11 Submitter: Peter Dimov Opened: 2007-05-10 Last modified: 2016-01-28
Priority: Not Prioritized
View all other issues in [refwrap.const].
View all issues with C++11 status.
Discussion:
A reference_wrapper can be constructed from an rvalue, either by using the constructor, or via cref (and ref in some corner cases). This leads to a dangling reference being stored into the reference_wrapper object. Now that we have a mechanism to detect an rvalue, we can fix them to disallow this source of undefined behavior.
Also please see the thread starting at c++std-lib-17398 for some good discussion on this subject.
[ 2009-05-09 Alisdair adds: ]
Now that ref/cref are constained that T must be an ObjectType, I do not believe there is any risk of binding ref to a temporary (which would rely on deducing T to be an rvalue reference type)
However, the problem for cref remains, so I recommend retaining that deleted overload.
[ 2009-05-10 Howard adds: ]
Without:
template <class T> void ref(const T&& t) = delete;I believe this program will compile:
#include <functional> struct A {}; const A source() {return A();} int main() { std::reference_wrapper<const A> r = std::ref(source()); }I.e. in:
template <ObjectType T> reference_wrapper<T> ref(T& t);this:
ref(source())deduces T as const A, and so:
ref(const A& t)will bind to a temporary (tested with a pre-concepts rvalue-ref enabled compiler).
Therefore I think we still need the ref-protection. I respectfully disagree with Alisdair's comment and am in favor of the proposed wording as it stands. Also, CWG 606 (noted below) has now been "favorably" resolved.
[ Batavia (2009-05): ]
We agree with the proposed resolution. Move to Tentatively Ready.
Proposed resolution:
In 22.10 [function.objects], add the following two signatures to the synopsis:
template <class T> void ref(const T&& t) = delete; template <class T> void cref(const T&& t) = delete;
[ N2292 addresses the first part of the resolution but not the second. ]
[ Bellevue: Doug noticed problems with the current wording. ]
[ post Bellevue: Howard and Peter provided revised wording. ]
[ This resolution depends on a "favorable" resolution of CWG 606: that is, the "special deduction rule" is disabled with the const T&& pattern. ]