AUTOSAR C++14 Rule A13-5-5

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

Описание

Управляйте определением

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

Объяснение

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

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

Выражения сравнения являются основными операциями и должны быть noexcept. Операторы сравнения, охваченные этим правилом:

  • ==

  • !=

  • <

  • <=

  • >

  • >=

Примечание

Объявите операторы сравнения как 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