[dcl.ref] (original) (raw)

9 Declarations [dcl]

9.3 Declarators [dcl.decl]

9.3.4 Meaning of declarators [dcl.meaning]

9.3.4.3 References [dcl.ref]

In a declarationT DwhereDhas either of the forms

and the type of the contained declarator-id in the declarationT D1is “derived-declarator-type-list T”, the type of the declarator-id inDis “derived-declarator-type-list reference toT”.

[Example 1: typedef int& A;const A aref = 3;

The type ofarefis “lvalue reference to int”, not “lvalue reference to const int”.

— _end example_]

[Note 1:

A reference can be thought of as a name of an object.

— _end note_]

Forming the type “reference to cv void” is ill-formed.

A reference type that is declared using & is called anlvalue reference, and a reference type that is declared using && is called anrvalue reference.

Lvalue references and rvalue references are distinct types.

Except where explicitly noted, they are semantically equivalent and commonly referred to as references.

[Example 2:

void f(double& a) { a += 3.14; } double d = 0; f(d);declaresato be a reference parameter offso the callf(d)will add3.14tod.

int v[20];int& g(int i) { return v[i]; }g(3) = 7;declares the functiong()to return a reference to an integer sog(3)=7will assign7to the fourth element of the arrayv.

For another example,struct link { link* next;}; link* first;void h(link*& p) { p->next = first; first = p; p = 0;} void k() { link* q = new link; h(q);} declarespto be a reference to a pointer tolinksoh(q)will leaveqwith the value zero.

— _end example_]

It is unspecified whether or not a reference requires storage ([basic.stc]).

There shall be no references to references, no arrays of references, and no pointers to references.

The declaration of a reference shall contain aninitializer ([dcl.init.ref]) except when the declaration contains an explicitexternspecifier ([dcl.stc]), is a class member ([class.mem]) declaration within a class definition, or is the declaration of a parameter or a return type ([dcl.fct]); see [basic.def].

Attempting to bind a reference to a function where the converted initializer is a glvalue whose type is not call-compatible ([expr.call]) with the type of the function's definition results in undefined behavior.

Attempting to bind a reference to an object where the converted initializer is a glvalue through which the object is not type-accessible ([basic.lval]) results in undefined behavior.

[Note 2:

The object designated by such a glvalue can be outside its lifetime ([basic.life]).

Because a null pointer value or a pointer past the end of an object does not point to an object, a reference in a well-defined program cannot refer to such things; see [expr.unary.op].

As described in [class.bit], a reference cannot be bound directly to a bit-field.

— _end note_]

The behavior of an evaluation of a reference ([expr.prim.id], [expr.ref]) that does not happen after ([intro.races]) the initialization of the reference is undefined.

[Example 3: int &f(int&);int &g();extern int &ir3;int *ip = 0;int &ir1 = *ip; int &ir2 = f(ir3); int &ir3 = g();int &ir4 = f(ir4); char x alignas(int);int &ir5 = *reinterpret_cast<int *>(&x); — _end example_]

If a typedef-name ([dcl.typedef], [temp.param]) or a decltype-specifier ([dcl.type.decltype]) denotes a type TR that is a reference to a type T, an attempt to create the type “lvalue reference to cv TR” creates the type “lvalue reference to T”, while an attempt to create the type “rvalue reference to cv TR” creates the type TR.

[Note 3:

This rule is known as reference collapsing.

— _end note_]

[Example 4: int i;typedef int& LRI;typedef int&& RRI; LRI& r1 = i; const LRI& r2 = i; const LRI&& r3 = i; RRI& r4 = i; RRI&& r5 = 5; decltype(r2)& r6 = i; decltype(r2)&& r7 = i; — _end example_]