Операторы назначения должны быть объявлены с помощью 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® флаги определяемые пользователем назначение, составное назначение, шаг и декрементные операторы, когда:
У них нет квалификатора ref- & в своей декларации.
Они являются представителем функциями класса.
Они не объявлены как = delete.
Поскольку ref-qualifiers применимы только к нестатическим функциям представителя, это правило не применяется к операторам назначения, не являющимся членами.
Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».
| Группа: Специальные функции представителей |
| Категория: Консультационные, Автоматизированные |