К> Я правильно понимаю, что 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.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен