看 C++ Primer 的58页, 讲拷贝时不能忽略 底层const这里的说的原因有点牵强, 这里给出自己的理解

extern const  int ci =42; 

const int * p2  = &ci;

extern const  int *const p3= p2;  

int *p= p3;       //错,p没有底层const。

书上的解释是: p3是顶层const 也是底层const,拷贝p3可以不在乎其顶层const, 但是p3指向的是一个常量,因此不能用P3初始化p,  而p 只能指向非常量。  理解他说的意思是因为一个指向常量一个指向非常量。

但自己仔细想想, 底层const也可以指向一个非常量, 那是不是当p3一开始就用非常量初始化时,此时p3和p 都指向非常量了, int *p= p3; 是不是就正确了呢?  如果按书上的解释,给人的误解是当他俩都指向常量或非常量时就没问题了,  这是误解,产生误解是因为他没说清楚。

  我是这么理解: 指向常量的指针既可以指向常量 也可以指向非常量,  而一般普通指针只能指向非常量。

1、假设 不同时具有底层const也可以拷贝:

当有底层const的指针给  没有底层const的指针赋值时, 因为 前者可以指向常量或非常量,后者只能指向非常量, 所以前者无关紧要。感觉没啥不对的。

现在反过来:

当没有底层const的指针 给 有底层const的指针 赋值时, 因为前者只能指向非常量, 后者可以指向常量或非常量,问题来了: 当后者指向非常量,都只需非常量了,至于能不能改变所指对象值,这是二者自身的语法规定问题,不相关; 但是当后者指向的是常量时, 因为前者只能指向非常量, 那把对象的地址赋值给你了,缺不能指向常量,这就矛盾了。  所以,因为在此时情况下不能同时满足双方语法规则。 所以干脆就规定赋值时二者必须具有底层const。 这样就规避了这种情况。  不管是不是这个原因这么规定的, 但是可以这么理解这个规定。

2、  或者我们这么理解:  指针int * 必须指向类型匹配的对象, 而指向常量的指针是const int * ,  类型不匹配,所以不能拷贝, 也不能初始化。常量指针可以理解为值不变的指针

3、  或者这么理解也可以: 非常量可以转换为常量, 常量不可转换为非常量:  int * 可以转换为 const int *,  反之不行。

  不知道上面的三种理解是不是正确, 请理解真正原因的大神解疑答惑啊。

原文地址:https://www.cnblogs.com/qzhj-pipeofnaturalrule/p/12262893.html