下記、std::vectorのbeginの定義ですが、タイトルの通り戻り値のみ違う、引数が同じ関数のオーバーロードをしていると思います。
オーバーロードは普通引数が違う関数でないとエラーが出ると思うのですが、これはどういった仕組で定義されているのでしょうか。

_LIBCPP_INLINE_VISIBILITY iterator               begin() _NOEXCEPT;
_LIBCPP_INLINE_VISIBILITY const_iterator         begin()   const
_NOEXCEPT;
_LIBCPP_INLINE_VISIBILITY iterator               end() _NOEXCEPT;
_LIBCPP_INLINE_VISIBILITY const_iterator         end()     const      _NOEXCEPT;