Ссылочный тип C++ квалифицирован с const или энергозависимый

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

Описание

Ссылочный тип C++, квалифицированный с const или энергозависимый, происходит, когда переменная со ссылочным типом объявляется с 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