This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21 Core Issues List revision 115c. See http://www.open-std.org/jtc1/sc22/wg21/ for the official list.

2024-09-25


934. List-initialization of references

Section: 9.4.5  [dcl.init.list]     Status: CD2     Submitter: Mike Miller     Date: 8 July, 2009

[Voted into WP at October, 2009 meeting.]

According to 9.4.5 [dcl.init.list] paragraph 3,

Otherwise, if T is a reference type, an rvalue temporary of the type referenced by T is list-initialized, and the reference is bound to that temporary.

This means, for an example like

    int i;
    const int& r1{ i };
    int&& r2{ i };

r1 is bound to a temporary containing the value of i, not to i itself, which seems surprising. Also, there's no prohibition here against binding the rvalue reference to an lvalue, as there is in 9.4.4 [dcl.init.ref] paragraph 5 bullet 2, so the initialization of r2 is well-formed, even though the corresponding non-list initialization int&& r3(i) is ill-formed.

There's also a question as to whether this bullet even applies to these examples. According to the decision tree in 9.4 [dcl.init] paragraph 16, initialization of a reference is dispatched to 9.4.4 [dcl.init.ref] in the first bullet, so these cases never make it to the third bullet sending the remaining braced-init-list cases to 9.4.5 [dcl.init.list]. If that's the correct interpretation, there's a problem with 9.4.4 [dcl.init.ref], since it doesn't deal with the braced-init-list cases, and the bullet in 9.4.5 [dcl.init.list] paragraph 3 dealing with references is dead code that's never used.

Proposed resolution (July, 2009):

  1. Move the third bullet of the list in 9.4 [dcl.init] paragraph 16 to the top of the list:

  2. Change 9.4.5 [dcl.init.list] paragraph 3, bullets 4 and 5, as follows: