exponenta event banner

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

Операторы сравнения должны быть не являющимися членами функциями с идентичными типами параметров и noexcept

Описание

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

Операторы сравнения должны быть не входящими в состав группы функциями с идентичными типами параметров и noexcept.

Объяснение

Операторы сравнения не должны сравнивать объекты различных типов. При передаче объектов различных типов в качестве аргументов оператору сравнения оператор должен иметь возможность преобразовать один аргумент в тип данных другого.

Функции-члены имеют неотъемлемое ограничение, что неявный параметр объекта (тот, на который ссылается this указатель) не может быть преобразован в другой тип данных. Чтобы при необходимости поддерживать преобразования типов данных, определите операторы сравнения как функции, не являющиеся членами.

Выражения сравнения являются фундаментальными операциями и не должны отличаться друг от друга. Это правило охватывает следующие операторы сравнения:

  • ==

  • !=

  • <

  • <=

  • >

  • >=

Примечание

Объявить операторы сравнения как friend для обеспечения доступа к внутренним данным, аналогичным функции-члену. Такая практика допускается исключением из правила A11-3-1.

Внедрение Polyspace

Средство проверки помечает операторы сравнения, определенные как функции-члены. Средство проверки также помечает операторы сравнения, не являющиеся членами, которые:

  • Сравнение неидентичных типов параметров, таких как class тип и int.

  • Не объявлены с помощью noexcept спецификатор.

Поиск неисправностей

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

Примеры

развернуть все

Объявление nonComp::operator::== не соответствует, поскольку оператор сравнения объявлен как функция-член.

#include <cstdint>

class nonComp
{
  public:
      explicit nonComp(std::uint32_t d): m_d(d)
      {}
      bool operator ==(const nonComp& rhs) noexcept  //Non-compliant; member function 
      { 
          return m_d == rhs.m_d;
      }
  
  private:
      std::uint32_t m_d;
};


class Compliant
{
  public:
      explicit Compliant(std::uint32_t d): m_d(d)
      {}
      friend bool operator ==(Compliant const& lhs, Compliant const& rhs) noexcept
      {
          return lhs.m_d == rhs.m_d;
      }
  private:
      std::uint32_t m_d;
};
// Compliant; non-member, identical parameter types, noexcept

Класс Compliant объявляет operator::== в качестве friend, так что этот оператор сравнения соответствует.

Первое объявление operator::== сравнивает два различных типа данных, из-за которых этот оператор сравнения является несоответствующим.

#include <cstdint>

class nonComp
{
    using Self = nonComp;
};

class MemberFunc
{
    using Self = MemberFunc;
};

bool operator ==(const nonComp& lhs, //noncompliant; comparison operator for different data types.
                 const MemberFunc& rhs) noexcept
{
    return true;
}


bool operator ==(const nonComp& lhs, const nonComp& rhs) noexcept
{
    return true;
} //compliant; because it compares the same data types.

Второе заявление operator::== сравнивает те же типы данных, поэтому этот оператор сравнения совместим.

nonComp::operator::== не объявляется как noexcept, поэтому этот оператор сравнения является несоответствующим.

#include<cstdint>
class nonComp
{
  public:
    explicit nonComp(std::uint32_t d): m_d(d)
    {}
    friend bool operator ==(nonComp const& lhs, //Noncompliant; member function isn't noexcept 
                            nonComp const& rhs)
    {
        return lhs.m_d == rhs.m_d;
    }

  private:
    std::uint32_t m_d;
};


class Compliant
{
  public:
    explicit Compliant(std::uint32_t d): m_d(d)
    {}
    friend bool operator ==(Compliant const& lhs, Compliant const& rhs) noexcept
    {
        return lhs.m_d == rhs.m_d;
    }

  private:
    std::uint32_t m_d;
};
// Compliant; non-member, identical parameter types, noexcept

Compliant::operator::== объявлен как noexcept, поэтому этот оператор сравнения совместим.

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

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