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