AUTOSAR C++14 Rule A14-1-1

Шаблон должен проверять, подходит ли определенный аргумент шаблона для этого шаблона

Описание

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

Шаблон должен проверять, подходит ли определенный аргумент шаблона для этого шаблона.

Объяснение

Шаблон задает операции класса или функции для типовых типов шаблона. Если эти операции требуют, чтобы типы шаблона имели определенные характеристики, например, тип данных должен быть конструируемой копией, проверять аргументы шаблона, чтобы гарантировать, что они подходят и имеют необходимые характеристики. Как правило, вы используете static_assert утверждения, чтобы выполнить эту проверку во время компиляции, например, static_assert(std::is_copy_constructible<T>).

Реализация Polyspace

Polyspace® шаблонные классы флагов и функции, если одно из следующего не верно:

  • Шаблон содержит по крайней мере один static_assert утверждение, даже если то утверждение не тестирует характеристики параметров шаблона.

  • Шаблон явным образом полностью специализирован, даже когда он не содержит static_assert утверждения.

Polyspace не отмечает объявления шаблона.

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

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

Примеры

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

#include <cstdint>
#include <type_traits>

template<typename T>
class myTemplate  // Compliant. Use of static_assert
{

    static_assert(std::is_copy_constructible<T>(),
                  "Template type not copy constructible.");
    //...

};
template<typename T>
class specializedClass //Non-compliant
{
};

template<>
class specializedClass<std::int32_t>  // Compliant. Explicit full specialization
{
};

class myClass  //Not a template
{
public:
    myClass() = default;
    myClass(myClass const&) = delete;

};

class myOtherClass  //Not a template
{

};

template<typename T>
void func_decl(T const& obj) noexcept(false); // Compliant. Template declaration


template <typename T>
void func_def(T const& obj) noexcept(false)  //Non-compliant
{


}



void F()
{

    //myTemplate<myClass> a; // myClass is not copy constructible. Compile-time error.
    myTemplate<myOtherClass> b; //myOtherClass is copy constructible.
}

В этом примере, specializedClass шаблонов и func_def несовместимы, потому что эти шаблоны не проверяют свои типы шаблона.

Polyspace не делает флага myTemplate потому что это использует static_assert проверять, конструируем ли тип шаблона копией. Если инстанцирование myTemplate<myClass> в функциональном F() не прокомментирован, результаты утверждения в ошибке времени компиляции.

Точно так же Polyspace не отмечает:

  • Явным образом полностью специализированный шаблон specializedClass<std::int32_t>.

  • Объявление шаблона функции func_decl.

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

Группа: шаблоны
Категория: консультация, неавтоматизированная
Введенный в R2021b