为什么编译器不为 const T f() 发出警告?

主要观点:

  • 作者收到[Sándor Dargó]的关于为何编译器不针对“通过常量值返回(类类型)”给出警告的疑问。
  • 解释了编译器不默认诊断“通过常量值返回(类类型)”的原因可能是噪声过多,且该模式已在许多第三方库中使用难以更改。
  • 作者修改自己的 Clang 分支以在-Wqual-class-return-type警告标志下诊断cv 类返回类型,并在雇主的代码库中进行了测试,发现很多需要修改的地方,且多数情况是将const T f()修改为T f()等。
  • 指出了该诊断暴露的两个有趣的怪癖,一个是关于constauto的绑定,另一个是与“通过常量值返回”相关的Tie类的赋值运算符问题。

关键信息:

  • GCC 和 Clang 在-Wignored-qualifiers标志下可诊断const限定的primitive返回类型,仅const限定的class返回类型让编译器犯难。
  • Clang 处理const限定的类类型诊断的代码有导致错误的地方。
  • 作者修改 Clang 分支后在雇主代码库中发现很多需要修改的const类返回类型的情况。
  • 两个怪癖的具体代码示例及解释。

重要细节:

  • const all the things?”中提到“通过常量值返回总是错误的”。
  • 编译器实际上需避免诊断const string f(),因为它们已决定诊断const int f()
  • 在作者修改的 Clang 分支中,发现的需要修改的const类返回类型的具体情况,如将const T f()修改为T f()等。
  • 第一个怪癖中const S f(); S g();auto&绑定情况及修复方法。
  • 第二个怪癖中const Tie f(int& i); Tie g(int& i);的问题及Tie类的正确赋值运算符写法。
阅读 13
0 条评论