C++ reference type qualified with const or volatile

Ссылочный тип объявляется с избыточным const или volatile спецификатор

Описание

Этот дефект происходит, когда переменная со ссылочным типом объявляется с const или volatile спецификатор, например:

char &const c;

Риск

C++ 14 Стандартов утверждает тот const или volatile полные ссылки плохо формируются (если они не введены через typedef, в этом случае они проигнорированы). Например, ссылка на одну переменную не может быть сделана, чтобы относиться к другой переменной. Поэтому использование const спецификатор не требуется для переменной со ссылочным типом.

Часто использование этих спецификаторов указывает на ошибку кодирования. Например, вы означали объявлять ссылку на const- квалифицированный тип:

char const &c;
но вместо этого объявленный const- полная ссылка:
char &const c;
Если ваш компилятор не обнаруживает ошибку, вы видите неожиданные результаты. Например, вы можете ожидать c быть неизменяемым, но видеть различное значение c по сравнению с его значением в объявлении.

Фиксация

Смотрите если const или volatile спецификатор неправильно помещается. Например, смотрите, хотели ли вы обратиться к const- квалифицированный тип и вводимый:

char &const c;
вместо:
char const &c;
Если спецификатор неправильно помещается, зафиксируйте ошибку. Поместите const или volatileспецификатор перед & оператор. В противном случае удалите избыточный спецификатор.

Примеры

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

int func (int &const iRef) {
    iRef++;
    return iRef%2;
}

В этом примере, iRef const- тип полной ссылки. Начиная с iRef не может относиться к другой переменной, const спецификатор избыточен.

Коррекция — удаляет const Спецификатор

Удалите избыточный const спецификатор. Начиная с iRef изменяется в func, это не предназначено, чтобы относиться к const- квалифицированная переменная. Перемещение const спецификатор перед & вызовет ошибку компиляции.

int func (int &iRef) {
    iRef++;
    return iRef%2;
}
Коррекция — фиксирует размещение const Спецификатор

Если вы не идентифицируете, чтобы изменить iRef в func, объявите iRef как ссылка на const- квалифицированная переменная. Поместите const спецификатор перед & оператор. Убедитесь, что вы не изменяете iRef в func.

int func (int const &iRef) {
    return (iRef+1)%2;
}

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

Группа: Хорошая практика
Язык: C++
Значение по умолчанию: Off
Синтаксис командной строки: CV_QUALIFIED_REFERENCE_TYPE
Удар: низко
Введенный в R2019a