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的引用。