AUTOSAR C++14 Rule A13-3-1

Функция, которая содержит "передающую ссылку" в качестве ее аргумента, не должна быть перегружена

Описание

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

Функция, которая содержит "передающую ссылку" в качестве ее аргумента, не должна быть перегружена.

Объяснение

Предположим, что вы задаете функцию шаблона func с передающим параметром ссылки T&& как это:

template <typename T> void func(T&& param) {}
Предположим, что вы перегружаете эту функцию шаблона с другой функцией:
void func(int param) {}
Когда функциональный func называется, это затрудняет, чтобы сказать, решает ли вызов к функции шаблона или перегрузке, не работая через запутанность механизма разрешения перегрузки. Разработчик или рецензент могут легко перепутать, какая функция вызвана после разрешения перегрузки. Например, вызов функции:
short var;
//...
func(var);
твердость к шаблону функционирует, потому что это - точное совпадение после инстанцирования шаблона, но разработчик или рецензент могут думать, что перегрузка называется потому что тип short продвигает int.

Чтобы избежать этой проблемы, не перегружайте на функциях шаблона тот, берут передающие ссылки. Для конструкторов шаблона можно ограничить конструкторов не совпадать с перегрузками (использующий std::enable_if). Когда ограничено этот путь, нет никакого осциллографа для беспорядка между конструктором шаблона и его перегрузками.

Реализация Polyspace

Средство проверки отмечает определения функций шаблона, которые содержат передающие ссылки (параметры шаблона с типом T&&) если те функции также перегружаются. События ниже результата средства проверки показывают местоположения перегрузок. Если перегрузка является неявно заданной функцией членства, такой как конструктор, соответствующее событие указывает на содержание класса.

Средство проверки показывает, что вы все обрабатываете функции по шаблону с передачей ссылок, которые перегружаются. Если вы решаете, что перегрузка не может вызвать беспорядок, добавьте комментарий в свой результат или код, чтобы избежать другого анализа. Смотрите Результаты Polyspace Адреса Через Исправления ошибок или Выравнивания или Результаты Адреса в Polyspace доступ Через Исправления ошибок или Выравнивания.

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

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

Примеры

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

#include <cstdint>

template <typename T> 
void func(T&& t) noexcept(false) //Noncompliant
{                                 
}

void func(
  std::int32_t&& t) noexcept
{
}

В этом примере, функциональном func(std::int32_t &&) перегружает функцию шаблона с тем же именем и нарушает правило.

#include <type_traits>

class A
{
public:
	template<typename T>
	A(T &&value) {} //Noncompliant
};

class B
{
public:
	template<typename T,
	std::enable_if_t<! std::is_same<std::remove_cv_t<
	std:: remove_reference_t<T>>, B>::value> * = nullptr>
	B(T &&value) {} //Compliant
};

A getObjA();
B getObjB();

void func() {
	A objA = getObjA();
	B objB = getObjB();
}

В этом примере, класс A имеет конструктора шаблона, который перегружается неявным конструктором перемещения класса A. Перегрузка нарушает правило.

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

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

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