Except in the special case of writing meta-programs, which only operate upon constant expressions, it's not necessary, but rather a good practice.
C++'s name lookup and resolution are very complex, which means that it is quite possible to silently use the wrong name, and potentially to change things that shouldn't be changed; const prevents this. It also distinguishes between things the user should expect to change, and things the user should usually not (rather, usually must not) change. Further, it's much easier to prove correctness of (e.g.) certain compiler optimizations when the compiler can guarantee certain operations don't change things.
# include <iostream>
constexprauto CHARS_PER_LINE = 7;
//should still use 'const' qualifiers as explained by mbozzi
int main()
{
size_t counter{};
for (char letter = 'A'; letter <= 'Z'; ++letter)
//letter is variable local to for loop, can be declared auto as well
{
std::cout << letter;
if (++counter % CHARS_PER_LINE == 0)
//if (((++counter) % CHARS_PER_LINE) == 0)
// alt version to be careful with any op precedence issues
{
std::cout << "\n";
}
}
}