This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21 Core Issues List revision 117a. See http://www.open-std.org/jtc1/sc22/wg21/ for the official list.
2025-04-13
2801. Reference binding with reference-related typesSection: 9.5.4 [dcl.init.ref] Status: DRWP Submitter: Brian Bi Date: 2023-09-18[Accepted as a DR at the November, 2023 meeting.]
Consider:
int* p; const int*&& r = static_cast<int*&&>(p);
The intent of core issues 2018 and 2352 was to make this example ill-formed, because it surprisingly introduces a temporary.
Proposed resolution (approved by CWG 2023-10-20):
Change in 9.5.4 [dcl.init.ref] bullet 5.4 as follows:
- Otherwise : , T1 shall not be reference-related to T2.
If T1 is reference-related to T2:
- If T1 or T2 is a class type and T1 is not reference-related to T2, user-defined conversions are considered using the rules for copy-initialization of an object of type “cv1 T1” by user-defined conversion (9.5 [dcl.init], 12.2.2.5 [over.match.copy], 12.2.2.6 [over.match.conv]); the program is ill-formed if the corresponding non-reference copy-initialization would be ill-formed. The result of the call to the conversion function, as described for the non-reference copy-initialization, is then used to direct-initialize the reference. For this direct-initialization, user-defined conversions are not considered.
- Otherwise, the initializer expression is implicitly converted to a prvalue of type “T1”. The temporary materialization conversion is applied, considering the type of the prvalue to be “cv1 T1”, and the reference is bound to the result.
- cv1 shall be the same cv-qualification as, or greater cv-qualification than, cv2; and
- if the reference is an rvalue reference, the initializer expression shall not be an lvalue. [Note 3: This can be affected by whether the initializer expression is move-eligible (7.5.5.2 [expr.prim.id.unqual]). —end note]
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