Корректировка указателя без множественного наследования
Рассмотрим макет класса:
| 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
может быть косвенно преобразован в любой тип указателя, в некоторых случаях может потребоваться явное приведение, например, при работе с шаблонами.