const Parameter和Argument
当我们使用const
parameter时,我们讨论的都是低层的const。
我们来回忆一下,
const int ci = 42; // const是顶层的
int i = ci; // OK;拷贝ci时,顶层const被忽略
int * const p = &i; // const是顶层的
*p = 0; // 虽然不同对p赋值;但是通过p修改值是可以的
同样的,当拷贝argument来初始化parameter,顶层const会被忽略。因此,parameter的顶层const会被忽略。 我们可以传递一个const或非const的对象给顶层const的parameter。
比如,void fcn(const int i);
,我们可以给它传递const int或者一个普通的int。
在parameter的顶层const会被忽略意味着,通过增加const
是无法完成重载的。
void fcn(const int i){}
void fcn(int i){} // error: redefines fcn(int)
指针或引用Parameter与const
还是那句话,parameter的初始化方式和变量的初始化方式一样。
我们来回忆一下,
int i = 42;
const int *cp = &i;
const int &r = i;
const int &r2 = 42;
int *p = cp; // error: p和cp的类型不匹配
int &r3 = r; // error: 类型不匹配
int &r4 = 42; // error:不能使用字面常量来初始化普通引用
这些规则在parameter传递时都一样。
假设reset(int *ip); reset(int &i)
。
int i = 0;
const int ci = i;
string::size_type ctr = 0;
reset(&i); // ok
reset(&ci); // error
reset(i); // ok
reset(ci); // error
reset(42); // error
reset(ctr); // error
如果可能的话,使用指向const的引用。