メインコンテンツ

AUTOSAR C++14 Rule M14-5-3

A copy assignment operator shall be declared when there is a template assignment operator with a parameter that is a generic parameter.

説明

ルール定義

A copy assignment operator shall be declared when there is a template assignment operator with a parameter that is a generic parameter.

根拠

ユーザー定義の代入演算子を宣言すると、対応する暗黙的演算子が抑止されます。ジェネリック パラメーターを持つテンプレート代入演算子を宣言すると、この動作は維持されません。この場合、暗黙的なシャロー コピー代入演算子を抑止するには、該当するクラスに対して明示的にコピー代入演算子のバージョンをインスタンス化します。

クラスに対してコピー代入演算子を宣言しない場合、コンパイラによって生成されたコピー代入演算子が代わりに実装で使用される可能性があります。明示的にコピー代入演算子を宣言しない場合、ディープ コピーが意図されているのにシャロー コピーが作成されるなど、予期せぬ結果を招く場合があります。

Polyspace 実装

構造体、クラス、または共用体にジェネリック パラメーターを持つテンプレート代入演算子が含まれるが、その構造体、クラス、または共用体内にコピー代入演算子が存在しない場合、Polyspace® はこのチェッカーにフラグを設定します。

トラブルシューティング

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

すべて展開する

#include<cstdint>
namespace example
{
  class A          // Noncompliant
  {
    public:		
	  
      template <typename T>
      T & operator= ( T const & rhs )
      {
        if ( this != &rhs ) {
          delete i;
          i = new int32_t;
          *i = *rhs.i;
        }
        return *this;
      }
    private:
      int32_t * i;      // Member requires deep copy
  };
  
  void f ( A const & a1, A & a2 )
  {
    a2 = a1;   
  }
};

class A 内でコピー代入演算子が宣言されていないため、Polyspace はこのクラスにフラグを設定します。暗黙的に定義されたコピー代入演算子はテンプレート代入演算子によって抑止されません。その結果、a1 から a2 へのディープ コピーが必要な場合にシャロー コピーが作成されます。

#include<cstdint>
namespace example
{
  class A                 
  {
    public:
      A & operator= (A const & rhs) {};    //Compliant
	  
      template <typename T>
      T & operator= ( T const & rhs )      //Compliant
      {
        if ( this != &rhs ) {
          delete i;
          i = new int32_t;
          *i = *rhs.i;
        }
        return *this;
      }
    private:
      int32_t * i;
  };
  
  void f ( A const & a1, A & a2 )
  {
    a2 = a1;   
  }
};

class A にはコピー代入演算子の宣言が含まれているため、Polyspace はこのクラスにフラグを設定しません。

チェック情報

グループ: テンプレート
カテゴリ: Required、Automated

バージョン履歴

R2019a で導入