C++ 报错的 qualifiers 的意思

问题背景

编译下面这段代码时遇到了报错:

bash 复制代码
ubuntu@:~///$ g++ zzx_const.cpp
zzx_const.cpp: In function 'void printPerson(const Person&)':
zzx_const.cpp:34:14: error: passing 'const Person' as 'this' argument discards qualifiers [-fpermissive]
   34 |     p.setName("test");  // 不能调用非 const 函数
      |     ~~~~~~~~~^~~~~~~~
zzx_const.cpp:21:10: note:   in call to 'void Person::setName(const string&)'
   21 |     void setName(const std::string& n)
      |          ^~~~~~~

疑问: 报错信息里的 qualifiers 是不是"限定符、修饰符"的意思

解答

可以翻译为**"限定符"。在 C++ 中,它专指 类型限定符**,也叫 cv 限定符(cv-qualifiers),只有两个:

  • const
  • volatile

因此 discards qualifiers 的意思是"丢弃了限定符 ",在这个例子里丢掉的就是 const。

qualifier 与 specifier 的区别

"修饰符"这个词的范围比 qualifier 更宽,并不完全对应:

术语 中文 典型关键字
qualifier 限定符 const、volatile
specifier 说明符 static、inline、virtual、explicit

报错里出现 qualifiers 时,基本就是指 const 或 volatile。

补充:为什么报错里会出现 'this'

成员函数末尾的 const(如 getName() const)同样是 cv 限定符,它限定的是隐含的 this 指针,使 this 的类型变为 const Person*。

在本例中:

  • printPerson 的参数是 const Person&,所以 p 是 const 对象
  • setName 不是 const 成员函数,它的 this 类型是 Person*
  • 用 const 对象调用非 const 成员函数,相当于把 const Person* 转成 Person*,丢掉了 const,因此报错 discards qualifiers

解决方法: 如果 setName 确实需要修改对象,就不要对 const 对象调用它;如果是只读函数(如 getName),则在函数末尾加上 const。

复制代码
相关推荐
揽星河..2 小时前
【C++】类和对象
c++·算法
D e re k ZH2 小时前
C++ 并发、未定义行为与工程化难点(No 3)
数据结构·c++·算法·面试
不积跬步无以至千里mmbb263 小时前
rust_analysis
开发语言·后端·rust
暴力求解3 小时前
C++ ---继承(二)
开发语言·c++·算法
陈飞EXCEL3 小时前
北京杰飞 IT 旗下妙码生花少儿Python编程上线两大学习系统
开发语言·python·学习
代龙涛4 小时前
WordPress Query 查询机制详解(WP_Query)
开发语言·后端·php·wordpress
znsoft4 小时前
MaClaw(码卡龙)技术拆解:一个 Go + React 的可自进化智能体平台
开发语言·react.js·golang
凉茶钱6 小时前
红黑树:用“颜色”换“平衡”,set 与 map 的底层发动机
开发语言·c++·红黑树
高冷小鱼殿下6 小时前
内部类Lambda与枚举
java·开发语言