AUTOSAR C++14 Rule A8-4-5

"используйте" параметры, объявленные, когда X && должны всегда перемещаться от

Описание

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

"используйте" параметры, объявленные, когда X && должны всегда перемещаться от.

Объяснение

При объявлении функции вы можете указать на свое намерение переместить содержимое параметра функции путем объявления его как nonconst и не обработать по шаблону rvalue ссылку или "использование" (X&&) параметр. Например, параметр этой функции объявляется как "использовать" параметр: void foo(std::vector<std::string>&& V). Это объявление подразумевает что содержимое векторного V предназначается, чтобы быть перемещенным вместо скопированного в теле функции.

Когда вы объявите параметр функции как "использовать" параметр, используйте семантику перемещения при использовании параметра. В теле функции используйте std::move функционируйте явным образом, если вы используете lvalue ссылку, чтобы вызвать функцию.

Реализация Polyspace

Polyspace® отмечает определение функции, если оба из этих условий верны:

  • По крайней мере один параметр функции объявляется как nonconst и нешаблон rvalue ссылка, то есть, "использование" или X&& параметр.

  • Содержимое X&& параметр не полностью перемещен в другой объект при помощи std::move функция в теле функции.

Polyspace не повышает этот дефект в конструкторах перемещения и перемещает операторы присваивания.

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

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

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

#include <utility>
class C
{
	C(C&& c): a{std::move(c.a)}     // Compliant by exception.
	{
	}

	C& operator=(C&& c)             // Compliant by exception.
	{
		a = std::move(c.a);

		return *this;
	}

	void move(C&& c)                // Noncompliant
	{
		a = std::move(c.a);//Partial move
	}

	void cond(C&& c, bool b)        // Compliant
	{
		if (b) {
			move(std::move(c));
		} else {
			a++;
		}
	}
public:
	int a;
	void set(int&& num)     // Compliant
	{
		a = std::move(num);
	}
	void set1(int&&)     // Noncompliant
	{
		//Unnamed temporary variable cannot be moved from.
	}
	void set2(int&& i12);  // Violation raised on definition.
	void set3(int&& i11a,  // Noncompliant
	int&& i11b)  // Noncompliant
	{
		if(i11a != i11b)
		{
		}
	}
	
};
void C::set2(int&& i12)   // Noncompliant
{
	a = i12;
}

template<typename T>
void tf1(T&& t1)      // Compliant - not a "consume" parameter
{
}

В этом примере, элемент данных a из класса C установлен в целое число при помощи семантики перемещения.

  • Polyspace не отмечает конструктора перемещения и оператор присваивания перемещения даже при том, что эти функции не полностью перемещают "использование" или X&& параметр. Эти функции совместимы исключением.

  • Polyspace отмечает функциональный C::move потому что тело функции частично перемещает "использование" или X&& параметр.

  • Polyspace отмечает функциональный C::set1 потому что это использование функции без имени "использует" параметр. Поскольку параметр без имени, вы не можете использовать функциональный std::move на этом X&& параметр.

  • Polyspace отмечает функциональный C:: set2 потому что тело функции копирует "использовать" параметр вместо того, чтобы использовать функциональный std::move. Polyspace повышает нарушение на определении переменной. Точно так же функциональный C::set2 также несовместимо с этим правилом, потому что его тело не использует std::move на X&& переменные.

  • Функциональный C::cond и C::set совместимы с этим правилом, потому что тела этих функций используют std::move на "использовать" параметрах.

  • Polyspace не отмечает шаблон функции, потому что это правило не применяется к шаблонам.

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

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