CL.ASSIGN.RETURN_CONST
赋值运算符 = 中返回的常量对象
这是一个类级别 (CL) 检查器,可就赋值运算符的参数类型,告知您潜在的限制或不明智的设计选择。类级别检查器会根据 Scott Meyer 的高效 C++ 规则类构造来生成建议。
CL.ASSIGN.RETURN_CONST 检查器可查找包含赋值运算符的类,这些运算符返回常量引用。使用这种返回类型时,将无法表达某些语言结构。无论这些语言结构是否需要,或是否具有争议,遵循下面的基本模板,以在无论使用何种类型时均能保证语言的一致性:
复制
class MyClass {
public:
MyClass& operator=(const MyClass&);
};
漏洞与风险
此设计选择不存在任何漏洞,但是有风险,即不熟悉的程序员将尝试使用“应该”正常工作但是不兼容的语言结构,并且还会遇到意义甚少或毫无意义的编译器警告(假定 C++ 编译器输出具有通常的复杂性)。
漏洞代码示例
复制
class C {
public:
const C& operator=(const C& rhs); // const return type
...
};
void foo(const C& tmpl) {
C obj;
(obj = tmpl).someNonConstMethod();
}
在此示例中,Klocwork 在第 3 行报告了一个 CL.ASSIGN.RETURN_CONST 错误。此设计选择的结果是一个编译器错误,该错误详细说明了在第 9 行的类 C 中使用赋值运算符的尝试是非法的。Klocwork 警告允许重新评估相应代码,避免返回类型出现设计限制。
修正代码示例
复制
class C {
public:
C& operator=(const C& rhs);
...
};
bool foo(const C& tmpl) {
C obj;
(obj = tmpl).someNonConstMethod();
}
在该修正代码示例中,第 3 行针对一个赋值运算符使用标准模板,确保在第 9 行上使用它的尝试将按预期起作用。