メインコンテンツ

AUTOSAR C++14 Rule A13-5-5

Comparison operators shall be non-member functions with identical parameter types and noexcept

説明

ルール定義

Comparison operators shall be non-member functions with identical parameter types and noexcept.

根拠

比較演算子で、型が異なるオブジェクトを比較してはなりません。型が異なるオブジェクトを引数として比較演算子に渡す場合、演算子は一方の引数をもう一方の引数のデータ型に変換できなければなりません。

メンバー関数には固有の制限があり、暗黙的なオブジェクト パラメーター (this ポインターによって参照されているもの) を別のデータ型に変換することはできません。必要に応じてデータ型変換をサポートするには、比較演算子を非メンバー関数として定義します。

比較式は基本的な演算であり、noexcept でなければなりません。このルールは、以下の比較演算子に適用されます。

  • ==

  • !=

  • <

  • <=

  • >

  • >=

メモ

メンバー関数と同様に比較演算子が内部データにアクセスできるようにするには、比較演算子を friend として宣言します。この手法は、ルール A11-3-1 の例外で許可されています。

Polyspace 実装

チェッカーはメンバー関数として定義されている比較演算子にフラグを設定します。また、非メンバー比較演算子についても、以下の場合はフラグを設定します。

  • 同一ではないパラメーター型 (classint など) を比較する場合。

  • noexcept 指定子を使用して宣言されていない場合。

トラブルシューティング

ルール違反が想定されるものの、Polyspace® から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

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::== の最初の宣言では 2 つの異なるデータ型を比較しているため、この比較演算子は非準拠です。


#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::== の 2 番目の宣言では同じデータ型を比較しているため、この比較演算子は準拠しています。

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 として宣言されているため、この比較演算子は準拠しています。

チェック情報

グループ: オーバーロード
カテゴリ: Required、Automated

バージョン履歴

R2020b で導入