[问题] 顶层、低层const

楼主: museangel (museangel)   2021-06-20 02:29:36
开发平台(Platform): (Ex: Win10, Linux, ...)
Win10
问题
刚入门学习C++,
C++ Primer, 5e, 2.4.3顶层的const小节提到:
“当我们拷贝一个物件,顶层const会被忽略。”
“另一方面,低层const永远都不会被忽略。”
其中有个举例:
const int ci = 42;
int &r = ci;//错误
1.“顶层const会被忽略、而低层就永远不会”这个原则是从哪里产生的呢?
为什么不要一律保留const,而要区别顶层低层,并且有忽略跟保留的差异,
这是为了解决什么问题吗?
2.为什么ci的顶层const没有被忽略呢?如果照顶层const会被忽略的原则,
应该可以将普通int&系结到const int物件上,为什么不行呢?
是因为参考并没有涉及拷贝的动作,单纯只是给另一个变量加上别名而已,
所以就没有忽略顶层const这件事吗?
请板上的大师们不吝教导,看了好几篇文章还是不理解为什么要有这种机制...
作者: nh60211as   2021-06-20 02:39:00
你那不是拷贝物件,是取得物件的reference
楼主: museangel (museangel)   2021-06-20 02:43:00
对耶 真的忽略这件事[email protected]@另外为什么要有区分顶层跟低层的机制呢 怎么不都保留呢
作者: LPH66 (-6.2598534e+18f)   2021-06-20 03:06:00
这里应该是指一个指标本身的常数性和指标指向值的常数性常数性这种事是绑在变量上的, 只要有一个方式参照变量那就能谈论这个参照存取的常数性 (不可变性)但当我们 assign 值出来时, 我们是复制值因此这最顶层变量参照被我们解参照了, 其常数性不再有意义因此讲忽略有点简略, 因为会忽略的原因是解参照取值了在这个例子里, int& 这是一个 C++ 参照, 参照一个变量所参照的变量是 ci, 这里是参照指定并没有解参照取值所以就算是顶层的常数性依然会保留
作者: g0010726 (Kevin)   2021-06-20 04:08:00
用个比喻来形容好了, 一个不能被涂改的书像是图书馆内的书(const Book), 你在copy后得到的新书究竟能不能被涂改你可以自己决定,跟原本的书没关系。但如果你有个reference或pointer代表着(指向)图书馆的书,这个状况下const就该被保留,因为那本图书馆的书不该被涂改
作者: sarafciel (Cattuz)   2021-06-20 08:59:00
const不是变量与生俱来的特性 const是一种契约关于"某个特定位置上的某个值,我不会去改他"的契约然后参考不是别名 参考是一种拷贝 只是他copy的东西是位置 参考实际上是封装后的指标 而不是别名你把问题想得太复杂了 实际上只是有没有可能改到那个ci的值 所以这份契约要不要延续的问题
作者: howareuuu   2021-06-21 08:24:00
推比喻

Links booklink

Contact Us: admin [ a t ] ucptt.com