AUTOSAR C++14 Rule A14-5-1

Конструктор шаблона не должен участвовать в разрешении перегрузки для отдельного аргумента типа класса включения

Описание

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

Конструктор шаблона не должен участвовать в разрешении перегрузки для отдельного аргумента типа класса включения.

Объяснение

Конструктор шаблона может привести к беспорядку, о которой копии или перемещаются, конструктор вызывается в копии или перемещении. Например:

  • Неявный конструктор может быть вызван, когда вы ожидаете, что конструктор шаблона будет использоваться. Неявный конструктор копии или перемещения существует в классе, потому что конструктор шаблона не предотвращает его определение.

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

Реализация Polyspace

Средство проверки повышает нарушение когда:

  • Класс содержит копию шаблона или конструктора перемещения, но по крайней мере одна копия или перемещение используют неявного конструктора в классе.

    Нарушение показывают на конструкторе шаблона. События, сопоставленные результатом, показывают копию или перемещение, где неявный конструктор вызывается.

  • Класс содержит копию шаблона или конструктора перемещения и явного конструктора, но по крайней мере одна копия или перемещение используют конструктора шаблона.

    Нарушение показывают на конструкторе шаблона. События, сопоставленные результатом, показывают копию или перемещение, где конструктор шаблона вызывается и определение явного конструктора.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.

Примеры

развернуть все

class record
{
  public:
    template<typename T> 
    record(const T &);  /*Non-compliant*/
};

void lookup(record aRecord)
{
    record copyOfARecord {aRecord};   
}

В этом примере, при создании объекта copyOfARecord от объекта aRecord, конструктор копии должен быть вызван. Специализация конструктора шаблона, то есть, record<record>(const record &), и неявный конструктор, то есть, record(const record &) одинаково хорошие кандидаты на конструктора копии. Когда функция и специализация являются одинаково хорошими соответствиями в процессе разрешения перегрузки, функция предпочтена. В этом случае неявный конструктор называется вместо конструктора шаблона, но разработчик или рецензент могут ожидать в противном случае.

class record
{
  public:
    record(const record &);
  
    template<typename T> 
    record(T &);  /*Non-compliant*/
};

void lookup(record aRecord)
{
    record copyOfARecord {aRecord};   
}

В этом примере, при создании объекта copyOfARecord от объекта aRecord, конструктор копии должен быть вызван. Специализация конструктора шаблона, то есть, record<record>(record &) лучшее соответствие по сравнению с явным конструктором, то есть, record(const record &). Конструктор шаблона называется вместо явного конструктора, но разработчик или рецензент могут ожидать в противном случае.

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

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