что стандарт говорит о статическом приведении к временному наследнику? - PullRequest
2 голосов
/ 21 сентября 2011

иногда (довольно редко) мне нужно получить защищенные члены от существующих переменных, например:

struct S {
protected:
 int i;
};

struct T : S {
 using S::i;
};

int main() {
 S s;
 static_cast<T&>(s).i = 0;
}

Я почти уверен, что это (static_cast (s)) UB, но кто-то знает, чтоСтандарт C ++ (2003) говорит об этой ситуации?

1 Ответ

1 голос
/ 21 сентября 2011

Этот тип операции фактически является основой для реализации шаблона шаблона с постоянным повторением, где внутри базового класса вы фактически 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. В противном случае результат приведения не определен.

Похоже, вы соответствуете всем требованиям, позволяющим избежать неопределенного поведения. То есть:

  1. Класс T является производным от S
  2. Преобразование указателя из S в T действительно существует, поскольку S является одновременно доступным и однозначным базовым классом T (требования с 4.10)
  3. Вы используете одинаковую квалификацию константы для обоих типов
  4. S не является виртуальным базовым классом T
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...