Expressions and statements
ES.22
Не объявляйте переменную, пока не получите значение для её инициализации
Причина
Читаемость. Ограничение области видимости переменной. Не рискуйте использованием до инициализации. Инициализация зачастую эффективнее присваивания.
Пример (плохой)
string s;
// ... здесь s не используется ...
s = "какая трата";
Пример (плохой)
SomeLargeType var; // трудночитаемое имяВВерблюжьемРегистре
if (cond) // какое-то нетривиальное условие
Set(&var);
else if (cond2 || !cond3) {
var = Set2(3.14);
}
else {
var = 0;
for (auto& e : something)
var += e;
}
// используем var; то, что это не сделано слишком рано, можно проверить статически только с потоком управления
Это было бы нормально, если бы для SomeLargeType существовала инициализация по умолчанию, которая не слишком дорогостоящая. В противном случае программист может вполне справедливо задаться вопросом: охвачен ли каждый возможный путь через лабиринт условий? Если нет, мы имеем ошибку «использование до установки значения». Это ловушка при сопровождении.
Для инициализаторов умеренной сложности, в том числе для const переменных, рассмотрите использование лямбды для выражения инициализатора; см. ES.28.
Контроль
- Отмечайте объявления с инициализацией по умолчанию, которым присваивается значение до первого чтения.
- Отмечайте любое сложное вычисление после неинициализированной переменной и до её использования.