最近学习C++ Primer 5th(英文版), 在函数部分(章节6),P.216,有一个例子如下:

voide fcn(const int i); //fcn can read but not write to i

当时很奇怪这个注释。
按照书上自己的定义(P.203),函数的argument和parameter的类型必须是匹配的,或者有parameter的隐式转换。那么对这个例子来说,就有:

1.这里是值传递,那么 fcn 会创建一个 arugment 的拷贝 parameter。
2.如果这个 parameter 是 const int 类型,那么很显然这个复制是不能完成的。
3.因此那么这个 parameter 只能是普通的 int 类型,top_level const 被忽略掉了。

那么问题来了,为什么这里的 parameter 是不可修改的?

然后我居然还写了一段代码来测试,这段代码主要想验证一下 parameter 是否可读。
结果编译器报错说不能对只读形参操作。

#include <iostream> 
using namespace std; 
void const_parameter(const int i); 
int main(int argc, char const *argv[]) 
{ 
const int a = 1; 
const_parameter(a); 
return 0; 
} 
void const_parameter(const int i){ 
++i; // try to modify parameter i but failed. 
} 

回头再看了一下自己刚才的思路,其实在第二步就有一个非常大的问题,弄混了constinitializationassignment在 pass by value 这个过程中,进行的操作其实是用 argument 对 parameter 进行初始化,而不是 assignment。而对于 const 来说,初始化的时候是允许给一个const类型的初始值的,比如:

const int i = 10; 
const int j = i; //no problem at all! 

所以先前 function 里的这个 parameter 的定义已经很清楚了,不管你怎么转换,不管你 argument 里是啥值,来了都得给我变成 const int 类型,这也是为什么 i 不可写的原因。
真是不写程序不知道自己有多蠢啊。。。