const
ParametersAs we saw in § 6.2.3 (p. 212), top-level const
(§ 2.4.3, p. 63) has no effect on the objects that can be passed to the function. A parameter that has a top-level const
is indistinguishable from one without a top-level const
:
Record lookup(Phone);
Record lookup(const Phone); // redeclares Record lookup(Phone)
Record lookup(Phone*);
Record lookup(Phone* const); // redeclares Record lookup(Phone*)
In these declarations, the second declaration declares the same function as the first.
On the other hand, we can overload based on whether the parameter is a reference (or pointer) to the const
or nonconst
version of a given type; such const
s are low-level:
// functions taking const and nonconst references or pointers have different parameters
// declarations for four independent, overloaded functions
Record lookup(Account&); // function that takes a reference to Account
Record lookup(const Account&); // new function that takes a const reference
Record lookup(Account*); // new function, takes a pointer to Account
Record lookup(const Account*); // new function, takes a pointer to const
In these cases, the compiler can use the const
ness of the argument to distinguish which function to call. Because there is no conversion (§ 4.11.2, p. 162) from const
, we can pass a const
object (or a pointer to const
) only to the version with a const
parameter. Because there is a conversion to const
, we can call either function on a nonconst
object or a pointer to nonconst
. However, as we’ll see in § 6.6.1 (p. 246), the compiler will prefer the nonconst
versions when we pass a nonconst
object or pointer to nonconst
.