So many people are confused. In K&R C, a string literal can be changed. Hence, literals being constants meaning immutable is wrong. In ISO C and C++ variables of type T const for some T can also be changed, using a cast. So again, constant doesn't mean immutable. As @foo pointed out above, constants often do not have the properties of a variable because of optimisation, and in fact the semantics often specify it. Also do not forget in C and C++ there are constant expressions sometimes known as compile-time constants, used for array bounds, for example, a kind of constant which would never be confused with a variable, agree?
So here's a definition: a constant is a binding of a name to a value. With this definition,
1 is a constant because it is a literal name, and the binding is implicit. And here
there are two constants, namely
f: these are bindings of symbol names (in this case both identifiers, in C++
operator+ is also a name but not an identifier).
Now, I will show you another constant which will surprise you!
int y = 1;
y is a constant too! It is a binding of the name
y to an address.
[If on the stack, an offset from the frame base instead]
So actually pretty much everything in your abstract syntax is a constant if you think about it hard enough :)