Этот тип операции фактически является основой для реализации шаблона шаблона с постоянным повторением, где внутри базового класса вы фактически static_cast
указатель this
базового класса на тип шаблона производного класса. Поскольку S
является однозначным базовым классом T
, и вы не имеете доступа ни к каким членам из static_cast
, которые еще не являются членами S
, я не понимаю, почему у вас возникнут какие-либо проблемы.
Раздел 5.2.8 о статическом литье в пункте 5 гласит:
Значение l типа " cv1 B", где B - тип класса, может быть приведено к типу "ссылка на cv2 D", где D - производный класс ( пункт 10) из B, если существует действительное стандартное преобразование из «указателя на D» в «указатель на B» (4.10), cv2 является такой же квалификацией cv или большей квалификацией cv, чем, cv1 , а B не является виртуальным базовым классом D. Результатом является lvalue типа « cv2 D.» Если lvalue типа « cv1 B ”на самом деле является подобъектом объекта типа D, значение l ссылается на включающий объект типа D. В противном случае результат приведения не определен.
Похоже, вы соответствуете всем требованиям, позволяющим избежать неопределенного поведения. То есть:
- Класс
T
является производным от S
- Преобразование указателя из
S
в T
действительно существует, поскольку S
является одновременно доступным и однозначным базовым классом T
(требования с 4.10)
- Вы используете одинаковую квалификацию константы для обоих типов
S
не является виртуальным базовым классом T