If you want to check all index accesses, it makes sense implementing the range checking at your [] operator.
A good choice would be, providing both methods. E.g. at the container class std::vector , operator[] is implemented unchecked, but the container provides std::vector.at(), which has range checking.