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