exponenta event banner

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