First an informal explanation
Let's take it in logical steps.
A non-const method is allowed and assumed to change the object. As such it can be called on non-const objects only.
A const method is not allowed to change the object. As such it can be called on const objects, but also on non-const objects.
When both overloads of a functions are defined (const and non-const) the method chosen is the one whose constness fits the object constness.
The standard
In reality overload resolution has no special rule for const and non-const methods. Instead, the standard specifies an implicit object parameter. After you take into consideration this implicit object parameter, you can apply the usual overload resolution rules:
§13.3.1 Candidate functions and argument lists [over.match.funcs]
[...] a member function is considered to have an extra parameter, called the implicit object parameter , which represents the object for
which the member function has been called. For the purposes of
overload resolution, both static and non-static member functions have
an implicit object parameter, but constructors do not.
Similarly, when appropriate, the context can construct an argument list that contains an implied object argument to denote the object to
be operated on. Since arguments and parameters are associated by
position within their respective lists, the convention is that the
implicit object parameter, if present, is always the first parameter
and the implied object argument, if present, is always the first
argument.
For non-static member functions, the type of the implicit object parameter is
- (4.1) “lvalue reference to cv X” for functions declared without a ref-qualifier or with the & ref-qualifier
- (4.2) “rvalue reference to cv X” for functions declared with the && ref-qualifier
where X is the class of which the function is a member and cv is the
cv-qualification on the member function declaration. [ Example: for a
const member function of class X, the extra parameter is assumed to
have type “reference to const X”. —end example ] For conversion
functions, the function is considered to be a member of the class of
the implied object argument for the purpose of defining the type of
the implicit object parameter. For non-conversion functions introduced
by a using-declaration into a derived class, the function is
considered to be a member of the derived class for the purpose of
defining the type of the implicit object parameter. [...]
- During overload resolution, the implied object argument is indistinguishable from other arguments