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