AUTOSAR C++14 Rule A13-2-3

Реляционный оператор должен вернуть логическое значение

Описание

Определение правила

Реляционный оператор должен вернуть логическое значение.

Объяснение

Значение возврата от реляционных операторов стандартной библиотеки C++ может быть непосредственно проверено, чтобы увидеть, является ли отношение true или false. Перегрузки реляционного оператора должны соответствовать этому использованию. В противном случае пользователи перегруженного реляционного оператора могут увидеть неожиданные результаты. См. пример ниже.

Реализация Polyspace

Шашка помечает перегрузки реляционных операторов, которые не возвращают значение типа bool.

Поиск и устранение проблем

Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».

Примеры

расширить все

class aClass {
    int val;
public:
    aClass(int initVal) {
        val = initVal;
    }
    bool operator<=(aClass const& comparingObj )  noexcept{ //Compliant
        return(this->val <= comparingObj.val);
    }
    int operator>=(aClass const& comparingObj ) noexcept { //Noncompliant
        return(this->val <= comparingObj.val? -1:1);
    }
};

void func() {
    aClass anObj(0), anotherObj(1);
    if(anObj <= anotherObj) {
        /* Do something */
    }
    if(anObj >= anotherObj) {
        /* Do something else */
    }
}

В этом примере перегрузка operator<= возвращает логическое значение, но перегрузку operator>= не возвращает логическое значение. Однако в функциональных func, операторы <= и >= используются так, как если бы логическое значение возвращалось от перегруженных операторов. Потому что перегрузка operator>= не возвращает нуля значения, второй if оператор всегда является true, результатом, которого вы можете не ожидать.

Проверяйте информацию

Группа: Перегрузка
Категория: Необходимый, Автоматизированный
Введенный в R2020a