exponenta event banner

Правило AUTOSAR C++ 14 A13-2-3

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

Описание

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

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

Объяснение

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

Внедрение 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 оператор всегда верен, результат, которого можно не ожидать.

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

Группа: Перегрузка
Категория: Обязательно, Автоматизировано
Представлен в R2020a