C++ reference to const-qualified type with subsequent modification

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

Описание

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

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

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

Риск

The 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++
По умолчанию: Off
Синтаксис командной строки : WRITE_REFERENCE_TO_CONST_TYPE
Влияние: Низкое
Введенный в R2019a