You need to enable JavaScript to run this app. C++函数参数const关键字在声明定义中的使用及相关链接错误问题
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 08:15:03