void f(const int &i) { cout << i << endl; } void test(void) { f(123); }
At first glance, this code should generate an error because parameter
i
of f
is pass-by-reference. However, 123
is
a constant, which does not specify any storage to be passed by reference.
To our surprise, there is no compile-time error!
The reason that there is no error is because the expression does
evaluate to a constant value of
. However, in order for this
constant value to be useful for anything, it must exist as a value in
memory (on the stack, usually). In other words, the expression
does have a nameless storage. That's why it can still be passed
by reference.
The following code generates an error message:
void f(const int &i) { i = i + 1; }
This is because const int &i
says that ``i
is a reference
to a const int''. This means that whatever i
refers to cannot be
changed.
Parameters of the type const SomeType &
is used very often to
pass large objects efficiently. Although a reference is not a pointer,
passing an object by reference generates the same code as passing
the address of the object. This means const SomeType &
is
often more efficient than const SomeType
, especially when
SomeType
is a complex class with lots of data members.
Copyright © 2006-09-19 by Tak Auyeung