Ограничивайте области видимости переменных

Нет необходимости или удобства создавать переменные в старом стиле Си (ANSI C, он же С89) в начале функции. Создавайте там, где они нужны.

Неправильно:

uint64_t factorial(int n) {
    uint64_t result = 0; // Плохо

    if (n < 0)
        return result;

    result = 1;

    for (int i = 2; i <= n; ++i)
        result *= i;

    return result;
}

Правильно:

uint64_t factorial(int n) {
    if (n < 0)
        return 0;

    uint64_t result = 1;

    for (int i = 2; i <= n; ++i)
        result *= i;

    return result;
}

Объявляйте переменные внутри цикла for (для while эта возможность доступна только начиная с С++20) и условного перехода if (С++17). Это позволяет ограничить область действия переменной.

Неправильно:

auto count = values.size();
for (size_t i = 0; i < count; ++i) {
    auto state = GetState(i);
    if (state == -1)
        break;
    // ...
}

Правильно:

for (size_t i = 0, count = values.size(); i < count; ++i) {
    if (auto state = GetState(i); state == -1)
        break;
    else {
        // Здесь можно использовать state
    }
    // Здесь state уже недоступна
}