К> Я правильно понимаю, что c-style cast — это компилятор
К> последовательно пробует сделать function cast, static_cast,
К> а если не получилось — то reinterpret_cast ?

Почти.

function cast с одним аргументом определяется как раз через c-style cast, поэтому его, вообще, рассматривать не стоит.

const_cast, static_cast, reinterpret_cast а также их комбинации применяются в следующем порядке:
  • const_cast
  • static_cast
  • static_cast + const_cast
  • reinterpret_cast
  • reinterpret_cast + const_cast

Кроме того, в отличие от static_cast и reinterpret_cast, с помощью c-style cast можно приводить без соблюдения "прав доступа":
  • указатель/lvalue унаследованного класса — к указателю/ссылке базового класса:
    struct B { };
    struct D : private B { };
    D d;
    B* bp = (B*)&d;
    B& br = (B&)d;

  • указатель на член унаследованного — к указателю на член базового:
    struct B { };
    struct D : private B { int j; };
    int B::* bmp = (int B::*)&D::j;

  • указатель на член базового — к указателю на член унаследованного:
    struct B { int i; };
    struct D : private B { };
    int D::* dmp = (int D::*)&B::i;
При необходимости в этих случаях также будет применен const_cast.
Автор: Павел Кузнецов    Оценить