exponenta event banner

C++ ссылка на конст-квалифицированный тип с последующей модификацией

Ссылка на const-квалифицированный тип впоследствии изменяется

Описание

Этот дефект возникает, когда переменная ссылается на const-квалифицированный тип изменяется после объявления.

Например, в этом примере refVal имеет тип const int &, но его значение изменяется в последующем операторе.

using constIntRefType = const int &;
void func(constIntRefType refVal, int val){
   ...
   refVal = val; //refVal is modified
   ...
}

Риск

const квалификатор ссылочного типа подразумевает, что переменная типа инициализируется при объявлении и впоследствии не изменяется.

Компиляторы могут обнаруживать изменения ссылок на const-квалифицированные типы как ошибка компиляции. Если компилятор не обнаруживает ошибку, поведение не определено.

Зафиксировать

Избегайте изменения const-квалифицированные типы ссылок. Если требуется изменение, удалите const квалификатор из описания ссылочного типа.

Примеры

развернуть все

typedef const int cint;           
typedef cint& ref_to_cint;       

void func(ref_to_cint refVal, int initVal){
   refVal = initVal;
}

В этом примере: ref_to_cint является ссылкой на const-квалифицированный тип. Переменная refVal типа ref_to_cint должен быть инициализирован, когда func вызывается и впоследствии не изменяется. Изменение нарушает договор, подразумеваемый const квалификатор.

Исправление - Избежать изменения const-квалифицированные типы ссылок

Одна из возможных корректировок заключается в том, чтобы избежать const в объявлении ссылочного типа.

typedef int& ref_to_int;       

void func(ref_to_int refVal, int initVal){
   refVal = initVal;
}

Информация о результатах

Группа: Надлежащая практика
Язык: C++
По умолчанию: Откл.
Синтаксис командной строки: WRITE_REFERENCE_TO_CONST_TYPE
Воздействие: Низкий
Представлен в R2019a