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

Ссылка на 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++
Значение по умолчанию: 'off'
Синтаксис командной строки: WRITE_REFERENCE_TO_CONST_TYPE
Удар: низко

Введенный в R2019a