Корректировка указателя без множественного наследования

Рассмотрим макет класса:

| A | B | ( class B is derived from A )
0x0 0x8

Конечно, нет ничего, что можно было бы отрегулировать при понижении или понижении. но определяется ли поведение компилятора для этого случая в стандарте?

если нет, то, в целом, static_casting nullptr безопасен, когда нет множественного наследования.


A * volatile a_ptr = nullptr ; // or change with B * and cast to A * 
assert( ! static_cast< B * >( a_ptr ) ) ; // is that guaranteed by Standard.? 

Всегда ли компилятор (во всех реализациях) не выполняет настройку.

и в более общем случае (в случае множественного наследования), может ли компилятор настроить nullptr в static_cast.


связанный вопрос, также без ответа.

1 ответ

Решение

static_cast из nullptr всегда безопасно. Независимо от того, какой у вас макет класса, вы всегда можете static_cast nullptr в иерархии классов и будет иметь определенные результаты - nullptr отлитого типа.

Гарантия, что любой тип отлит из nullptr приведет к nullptr можно найти в стандарте 5.2.9:

Значение типа "указатель на cv1 B", где B - тип класса, может быть преобразовано в значение типа "pointerto cv2 D", где D - это класс, производный (раздел 10) от B, если допустимое стандартное преобразование существует от "указатель на D" до "указатель на B" (4.10), cv2 - это та же квалификация cv, что и cv1-квалификация, или более высокая, чем cv1, а B - ни виртуальный базовый класс D, ни базовый класс виртуальный базовый класс D. Значение нулевого указателя (4.10) преобразуется в значение нулевого указателя типа назначения.

Хотя nullptr может быть косвенно преобразован в любой тип указателя, в некоторых случаях может потребоваться явное приведение, например, при работе с шаблонами.

Другие вопросы по тегам