C++ const成员函数编译报参数类型推导错误,移除const后正常是什么原因
报错的核心技术原因
- C++中被
const修饰的类成员函数,执行期间不允许修改类实例的状态,因此函数内部访问到的所有类非静态成员都会自动被加上const限定。 - 你的
GetHumans()函数被const修饰时,成员变量clients会被视为常量容器,遍历得到的auto &c实际类型是const ClientInfo &,对其取地址得到的是const ClientInfo *类型的指针。 - 你定义的存储容器
vec的元素类型是ClientInfo *(非const指针),C++标准禁止const T*到T*的隐式转换(会破坏const正确性,允许通过非const指针修改原本被限定为常量的对象),因此调用push_back时参数类型不匹配,编译器抛出转换失败的错误。
移除const后编译正常的原因
去掉函数末尾的const修饰后,GetHumans()变为普通成员函数,内部访问的clients不再带有const限定,遍历得到的c类型为ClientInfo &,取地址得到的ClientInfo *和vector的元素类型完全匹配,因此编译通过。
优化建议
如果业务逻辑上该函数确实不需要修改类状态,推荐将返回容器的元素类型修改为const ClientInfo *,既保留函数的const修饰符,也符合C++的const正确性规范,避免意外修改数据。
内容的提问来源于stack exchange,提问作者user3034768
相关产品推荐
相关产品推荐

