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

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

Описание

Ссылка 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 = val;
}

В этом примере 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 = val;
}

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

Группа: Хорошая практика
Язык: C++
Значение по умолчанию: 'off'
Синтаксис командной строки: WRITE_REFERENCE_TO_CONST_TYPE
Влияние: низко

Введенный в R2019a