C++函数参数const关键字在声明定义中的使用及相关链接错误问题
问题1:链接错误的原因及值传递场景差异
- 链接错误的直接原因是你只声明了
test(int&)函数,没有提供它的定义,编译器在重载决议阶段选择了匹配度更高的test(int&),链接阶段找不到对应实现就报错。 test(int&)和test(const int&)确实是两个完全独立的函数:这里的const属于底层const,修饰引用指向的对象,属于C++函数签名的一部分,会参与重载判定。你提供的实现是test(const int&)这个重载,和声明的test(int&)没有关系。- 值传递场景能正常运行的原因是:非引用参数的const属于顶层const,只修饰参数这个局部变量本身,不属于函数签名的一部分。也就是说
void test(int in)和void test(const int in)是同一个函数的声明,你后续写的带const的实现就是对应前面的声明,所以不会有问题,也不会触发重载。
问题2:const在声明和定义中的书写规则
两种情况区别处理:
- 如果是底层const(修饰引用指向的内容、指针指向的内容,比如
const int&、const int*):属于函数签名的一部分,声明和定义必须保持一致,两者都要写,否则会被识别为不同的函数。 - 如果是顶层const(修饰参数本身,比如值传递的
const int、指针本身常量的int* const):不属于函数签名的一部分,声明可以写也可以不写,定义侧如果需要限制函数内部修改这个局部参数就加,不影响外部调用逻辑。
问题3:参数const的含义
你的理解完全正确:函数参数上的const仅限制当前函数内部对该参数的操作权限,和调用方传入的参数是否为常量没有强制关联:
- 底层const(比如
const int& in):表示函数内部不会修改in指向的内容,调用方可以传入常量也可以传入非常量,非常量传入后会被临时赋予只读权限,函数内部无法修改。 - 顶层const(比如
const int in):表示函数内部不会修改in这个局部拷贝变量,和调用方完全无关,因为值传递本身传的就是实参的副本,修改也不会影响外部。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

