AUTOSAR C++14 Rule A12-8-7

Операторы назначения должны быть объявлены с помощью ref-qualifier &

Описание

Определение правила

Операторы назначения должны быть объявлены с помощью ref-qualifier &.

Объяснение

Можно использовать проверку типа ref, чтобы указать, применяется ли функция или оператор к lvalues или rvalues. Функции или операторы, которые применяются к lvalues, имеют ref-квалификатор &. Функции и операторы, которые применяются к rvalues, имеют ref-квалификатор && в конце своего заявления.

Встроенные операторы назначения на C++ принимают только lvalues как входные параметры. Если пользовательские операторы назначения берут и rvalue, и lvalue как входные параметры, это может вызвать путаницу и ошибки. Рассмотрим этот код, где пользовательский оператор назначения для класса obj принимает и rvalues, и lvalues как входные параметры.

class obj{
	obj& operator=(Obj const&){
		//...
		return *this;
	}
	//...
};

int main(){
	int i,j,k;
	obj a,b,c;

	if((i+j)=k) // compilation error
	//...
	if((a+b)=c) // silent error
	//...
}

  • В первом if оператор equal-to-operator (==) записывается как оператор назначения (=) из-за типографской ошибки. Потому что встроенный оператор назначения для int не принимает rvalues как вход, оператор (i+j) = k вызывает ошибку компиляции.

  • Условие для второго if оператор содержит аналогичную ошибку. Поскольку определяемый пользователем оператор назначения для obj классов принимает как lvalues, так и rvalues как вход, оператор (a+b) = c компилируется без ошибок. The if блок выполняется неожиданно, в результате чего возникает безмолвная ошибка.

Чтобы избежать ошибок и неточностей, задайте, что операторы назначения берут только lvalues как входные параметры путем добавления ref-qualifier & к их заявлению.

Реализация Polyspace

Polyspace® флаги определяемые пользователем назначение, составное назначение, шаг и декрементные операторы, когда:

  • У них нет квалификатора ref- & в своей декларации.

  • Они являются представителем функциями класса.

  • Они не объявлены как = delete.

Поскольку ref-qualifiers применимы только к нестатическим функциям представителя, это правило не применяется к операторам назначения, не являющимся членами.

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

Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».

Примеры

расширить все

В этом примере показано, как операторы назначения флагов Polyspace и операторы шага или уменьшения, когда их объявления не задают квалификатор ref &.

#include<cstdint>
class Obj
{
public:
	Obj() = default;
	Obj& operator=(Obj const&) & = default; //Compliant    
	Obj& operator=(Obj&&) & = default;      //Compliant    
	Obj& operator++() & noexcept;           //Compliant    
	Obj& operator--()  noexcept;            //Noncompliant 
	Obj& operator<<=(Obj const&) noexcept;  //Noncompliant   
	Obj& operator>>=(Obj const&) & noexcept;//Compliant   
	Obj& operator+=(Obj const&)&;           //Compliant
	Obj& operator-=(Obj const&);            //Noncompliant
	Obj& operator*=(Obj const&)= delete;    //Compliant
	Obj& operator+(Obj const&)&;            //Compliant  
};

Obj& operator|=(Obj& f,const std::int32_t i) // Rule does not apply 
{
	return f;
}

Obj& Obj::operator+=(Obj const&) &  // Polyspace flags the declaration 
{
	return *this;
}
Obj F1() noexcept
{
	return Obj{};
}
int main()
{
	Obj c;
	//F1() += c; // Compilation Error
	//F1() = c; // Compilation Error
	F1() -= c; // Silent Bug
}

В main(), операторы назначения +=, -=, и = используются с входом rvlaue. Потому что объявления операторов += и = задайте проверку типа ref &, использование этих операторов с входным параметром rvalue приводит к отказу компиляции. Оператор -= объявляется без квалификатора ссылки &. Использование этого оператора с входным параметром rvalue создает молчаливую ошибку.

  • Polyspace помечает неделенные операторы назначения представителей, операторы шагов и операторы декрементов, которые не задают квалификатор ref & в своих декларациях.

  • Когда оператор назначения представителя объявляется без квалификатора ссылки & в классе и определенном в другом месте, Polyspace помечает объявление.

  • Polyspace не помечает операторы, не являющиеся членами, без ref-qualifier & поскольку это правило применяется только к нестатическим функциям представителя.

  • Polyspace не помечает удаленные операторы, потому что использует & ref-qualifier на удаленный оператор не влияет на код.

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

Группа: Специальные функции представителей
Категория: Консультационные, Автоматизированные
Введенный в R2020b