【C++笔记】顶层const和底层const
顶层const与底层const
之前看到这个概念时简单带过了,以为只是简单的称呼问题,重新看C++ Primer之后发现,顶层const与底层const在不同的情况下的处理不同,遂决定记录整理一下相关的内容。
定义
用名词顶层const(top-level const)表示指针本身是个常量,用名词底层const(low-level const)表示指针所指的对象是一个常量。因此,可以这么解释,如果对象本身是常量,那么这是个顶层const,比如算术类型、类、指针等,而底层const只与复合类型相关,如指针、引用等,表示所指的对象是一个常量。
实际应用中的区别
执行拷贝操作时
当执行对象的拷贝操作时,顶层const不受什么影响,可以直接当作被拷贝的对象:
int i = 0;
int *const p1 = &i;
const int ci = 42;
const int *p2 = &ci;
i = ci; // 正确
p2 = p3; // 正确
// 但是如下的操作却是错误的,也就是说对于底层const来说,拷入和拷出的对象必须具有相同的底层const,或者两个对象的数据类型必须能够转换
int *p = p3; // 错误,p3包含底层const的定义,但是p却没有
int &r = ci; // 错误,普通的int&不能绑定到int常量上
p2 = &i; //这是可以的,因为int*可以转换成const int*
总结下来就是如果仅仅是顶层const的话,在拷贝时没有影响,而如果是底层const,就需要考虑赋值符两边是否具有相同的底层const或者说两边的数据类型能够转换。
涉及auto类型说明符时
auto会忽略掉顶层const:
const int ci = i;
auto b = ci; // b是一个整数,但不是常量
如果希望auto能推断出来顶层const,则需要明确指出,即const auto f = ci;
当引用的类型为auto时:auto &g = ci;
此时g是一个整型常量引用,也就是说原来的初始化规则仍然适用(即编译器以引用对象的类型作为auto的类型)。
涉及decltype类型指示符时
decltype处理顶层const和引用的方式与auto不同,decltype返回变量的类型,其中包括顶层const和引用在内,即decltype会如实的反应所使用的变量的类型。
涉及函数重载时
在函数重载时,通常形参的顶层const会被忽略掉,也就是说如下两个函数声明是同一个函数,并没有实现函数重载:
int fun(const int i);
int fun(int i);
而底层const不会被忽略,当使用常量引用时,会选择第一个函数,使用非常量引用时,两者皆可,但是编译器会优先选用非常量版本的函数:
int fun(const int &i); //新函数,作用于常量引用
int fun(int &i); //新函数,作用于i的引用
本文作者:无涯清酒
本文链接:https://www.cnblogs.com/wuyawine/p/16533572.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步