readability-string-compare

查找使用 compare 方法进行字符串比较的情况。

一个常见的错误是使用字符串的 compare 方法而不是使用相等或不等运算符。compare 方法旨在用于排序函数,因此它返回一个负数、正数或零,具体取决于比较的字符串的字典顺序关系。如果可以使用相等或不等检查,建议使用该方法。建议这样做是为了避免对返回值进行错误解释的风险,并简化代码。由于可以提前终止,字符串相等和不等运算符可能比 compare 方法更快。

示例

// The same rules apply to std::string_view.
std::string str1{"a"};
std::string str2{"b"};

// use str1 != str2 instead.
if (str1.compare(str2)) {
}

// use str1 == str2 instead.
if (!str1.compare(str2)) {
}

// use str1 == str2 instead.
if (str1.compare(str2) == 0) {
}

// use str1 != str2 instead.
if (str1.compare(str2) != 0) {
}

// use str1 == str2 instead.
if (0 == str1.compare(str2)) {
}

// use str1 != str2 instead.
if (0 != str1.compare(str2)) {
}

// Use str1 == "foo" instead.
if (str1.compare("foo") == 0) {
}

上面的代码示例显示了此检查将发出警告的 if 语句列表。它们都使用 compare 来检查两个字符串的相等或不等,而不是使用正确的运算符。

选项

StringLikeClasses

包含以分号分隔的字符串类名称的字符串。默认情况下仅包含 ::std::basic_string::std::basic_string_view。如果此列表中的类具有与 std::string 类似的 compare 方法,则将以相同的方式进行检查。

示例

struct CustomString {
public:
  int compare (const CustomString& other) const;
}

CustomString str1;
CustomString str2;

// use str1 != str2 instead.
if (str1.compare(str2)) {
}

如果 StringLikeClasses 包含 CustomString,则该检查将建议使用相等运算符替换 compare