主要观点:
- 作者收到[Sándor Dargó]的关于为何编译器不针对“通过常量值返回(类类型)”给出警告的疑问。
- 解释了编译器不默认诊断“通过常量值返回(类类型)”的原因可能是噪声过多,且该模式已在许多第三方库中使用难以更改。
- 作者修改自己的 Clang 分支以在
-Wqual-class-return-type
警告标志下诊断cv 类返回类型
,并在雇主的代码库中进行了测试,发现很多需要修改的地方,且多数情况是将const T f()
修改为T f()
等。 - 指出了该诊断暴露的两个有趣的怪癖,一个是关于
const
和auto
的绑定,另一个是与“通过常量值返回”相关的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
类的正确赋值运算符写法。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。