AUTOSAR C++14 Rule A18-9-3

Станд.:: перемещение не должно использоваться на объектах, объявил const или const&

Описание

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

Станд.:: перемещение не должно использоваться на объектах, объявил const или const&.

Объяснение

Когда вы используете std::move() на объекте это брошено в rvalue. Компилятор затем управляет ресурсами в объекте путем вызова конструктора или оператора с самым близким списком параметров соответствия. Если вы вызываете std::move() на const или const& текстовый объект, вызов возвращает const или const& введите rvalue. Поскольку конструкторы перемещения и операторы не берут const аргумент типа, компилятор вызывает конструктора копии или оператор вместо конструктора перемещения или оператор. Рассмотрите этот фрагмент кода где const объект копируется, когда вы можете ожидать перемещение после вызова std::move().

class string{
	//...
public:
	string(const string& rhs);// copy contructor
	string(string&& rhs);     //move constructor
};

void print(string text) {
	cout<<text;
	//...
}

int main(){
	int const message = "Error";
	//..
	print(std::move(message))// the copy constructor is called
}
Тип возврата std::move(message) rvalue const string&&. Между перемещением и конструкторами копии класса string, только конструктор копии принимает const аргумент типа. Компилятор вызывает конструктора копии и копирует ресурсы message в text.

Поскольку std::move() не перемещает const или const& текстовый объект, избегайте использования std::move() на const или const& объекты. Если вы намереваетесь переместить ресурсы от объекта, не объявляйте его как const или const&.

Реализация Polyspace

Polyspace® отмечает использование std::move() on:

  • Объекты, которые объявляются const или const&.

  • Объекты, которые брошены к const или const&.

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

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

Примеры

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

#include <cstdint>
#include <utility>
class A
{
	// Implementation
};
void F1(const int32_t &is_const, int32_t &is_non_const)
{
	const A a1{};
	int32_t target = 0;
	A a2 = a1;              // Compliant
	A a3 = std::move(a1);   // Noncompliant
	
	target = 
	std::move((const int32_t &)is_non_const);// Noncompliant
	target = 
	std::move(static_cast<const int32_t &>(is_non_const));// Noncompliant 
	target = 
	std::move(const_cast<int32_t &>(is_const));// Compliant
}
int main(){
	//...
}

  • Polyspace отмечает использование std::move() с const объект a1. Компилятор вызывает конструктора копии, чтобы скопировать a1 к a3. Вы можете ожидать, что компилятор вызовет конструктора перемещения.

  • Polyspace также отмечает использование std::move() с объектом is_non_const когда это брошено к const. После кастинга компилятор вызывает конструктора копии, чтобы скопировать is_non_const к target. Вы можете ожидать, что компилятор вызовет конструктора перемещения.

  • Polyspace не отмечает использование std::move()с non-const возразите, что следует из кастинга const объект is_const в non-const введите при помощи const_cast. После кастинга, is_const больше не const объект. Компилятор вызывает конструктора перемещения.

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

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