and the type of the contained declarator-id in the declaration
TD1
is “derived-declarator-type-listT”,
the type of the declarator-id in
D
is “derived-declarator-type-list reference to
T”.
void f(double& a){ a +=3.14; }// ...double d =0;
f(d);
declares
a
to be a reference parameter of
f
so the call
f(d)
will add
3.14
to
d.
int v[20];
// ...int& g(int i){return v[i]; }// ...
g(3)=7;
declares the function
g()
to return a reference to an integer so
g(3)=7
will assign
7
to the fourth element of the array
v.
For another example,
struct link {
link* next;
};
link* first;
void h(link*& p){// p is a reference to pointer
p->next = first;
first = p;
p =0;
}void k(){
link* q =new link;
h(q);
}
declares
p
to be a reference to a pointer to
link
so
h(q)
will leave
q
with the value zero.
There shall be no references to references,
no arrays of references, and no pointers to references.
The declaration of a reference shall contain an
initializer ([dcl.init.ref])
except when the declaration contains an explicit
extern
specifier ([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].
A reference shall be initialized to refer to a valid object or function.
In particular, a null reference cannot exist in a well-defined program,
because the only way to create such a reference would be to bind it to
the “object” obtained by indirection through a null pointer,
which causes undefined behavior.
As described in [class.bit], a reference cannot be bound directly
to a bit-field.
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 cvTR”
creates the type “lvalue reference to T”, while an attempt to create
the type “rvalue reference to cvTR” creates the type TR.
[Example 3: int i;
typedefint& LRI;
typedefint&& RRI;
LRI& r1 = i; // r1 has the type int&const LRI& r2 = i; // r2 has the type int&const LRI&& r3 = i; // r3 has the type int&
RRI& r4 = i; // r4 has the type int&
RRI&& r5 =5; // r5 has the type int&&decltype(r2)& r6 = i; // r6 has the type int&decltype(r2)&& r7 = i; // r7 has the type int& — end example]