Это не идеальный ответ на вопрос «как обнаружить», но, если пользователь обращается к operator[]
через экземпляр const, выдается исключение, если индекс выходит за пределы.то есть
Datatype const& operator[]() const { .. // don't modify here, throw exception
Однако, если пользователь обращается к экземпляру через неконстантный экземпляр, он непременно расширяется, если индекс выходит за пределы (и находится в допустимых пределах)
Datatype& operator[]() { .. // modify here
По сути, вы используете атрибут const экземпляра, чтобы определить, какой будет ваша семантика (как это было сделано в std::map
- т.е. попытка вызвать operator[]
для экземпляра const карты приводит к ошибке компилятора - т.е.для карты нет константного значения operator[]
, поскольку функция гарантированно создает отображение, если ключ еще не существует.)