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 行上使用它的尝试将按预期起作用。