Операторы присваивания должны быть объявлены с касательно спецификатора &.
Операторы присваивания должны быть объявлены с касательно спецификатора &.
Можно использовать касательно спецификаторов, чтобы задать, применяются ли функция или оператор к lvalues или rvalues. Функции или операторы, которые применяются к lvalues, имеют & касательно спецификатора. Функции и операторы, которые применяются на rvalues, имеют && касательно спецификатора в конце их объявления.
Встроенные операторы присваивания на 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 оператор, равное - к оператору (==) записан как оператор присваивания (=) из-за типографской ошибки. Поскольку встроенный оператор присваивания для int не принимает rvalues как вход, оператор (i+j) = k вызывает ошибку компиляции.
Условие для второго if оператор содержит подобную ошибку. Поскольку пользовательский оператор присваивания для класса obj принимает и lvalues и rvalues, как введено, оператор (a+b) = c компиляции без ошибки. if блок неожиданно выполняется, приводя к тихой ошибке.
Чтобы избежать ошибок и беспорядка, укажите, что операторы присваивания берут только lvalues в качестве входных параметров путем добавления & касательно спецификатора к их объявлению.
Polyspace® отмечает пользовательское присвоение, составное присвоение, шаг и операторы понижения когда:
У них нет & касательно спецификатора в их объявлении.
Они - функции членства класса.
Поскольку касательно спецификаторов применимы только к нестатическим функциям членства, это правило не применяется к операторам присваивания лица, не являющегося членом какой-либо организации.
Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.
| Группа: Специальные функции членства |
| Категория: консультация, автоматизированная |