Я читаю Скотта Мейерса Effective C ++ 3-ий.
В пункте 3:
Используйте const всякий раз, когда это возможно. Чтобы использовать оператор функции-члена const [], оператор функции-неконста [] должен выполнить 2 операции приведения:
const_cast<char&>( static_cast<const TextBlock&>(*this) [position] )
Почему Скотт Мейерс использует static_cast<const TextBlock&>(*this)
вместо static_cast<const TextBlock>(*this)
?
static_cast<const TextBlock>(*this)
создаст временный объект, который копируется из *this
, А потом operator[]
будет вызван на него, а возвращенный char&
будет зависать при выходе из неконстантной функции-члена operator[]
, Обратите внимание, что разыменование на нем приводит к UB.
Других решений пока нет …