MISRA C++:2008 Rule 14-5-3

Оператор присваивания копии должен быть объявлен, когда будет оператор присваивания шаблона параметром, который является типовым параметром

Описание

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

Оператор присваивания копии должен быть объявлен, когда будет оператор присваивания шаблона параметром, который является типовым параметром.

Объяснение

При объявлении пользовательского оператора присваивания подавлен соответствующий неявный оператор. При объявлении оператора присваивания шаблона, который имеет типовой параметр, не сохраняется это поведение. В этом случае, чтобы подавить неявный мелко копирующий оператор, явным образом инстанцируйте версии оператора присваивания копии для класса.

Если вы не объявляете оператор присваивания копии для класса, сгенерированный компилятором оператор присваивания копии может использоваться вместо этого на реализации. Не объявление оператора присваивания копии явным образом может привести к неожиданному результату, такому как создание мелкой копии, когда глубокая копия была предназначена.

Реализация 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;   
  }
};

Поскольку никакой оператор присваивания копии не объявляется в классе, Polyspace отмечает class A. Неявно заданный оператор присваивания копии не подавлен оператором присваивания шаблона и результатами в мелкой копии a1 к a2, когда вы можете хотеть глубокую копию.

#include<cstdint>
namespace example
{
  class A//Compliant                 
  {
    public:
      A & operator= (A const & rhs) {};
	  
      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;
  };
  
  void f ( A const & a1, A & a2 )
  {
    a2 = a1;   
  }
};

Поскольку этот класс содержит объявление операции присвоения копии, Polyspace не делает флага class A.

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

Группа: шаблоны
Категория: необходимый
Введенный в R2013b