Для чого потрібен static_cast, як він працює і де його застосовують stack overflow російською

У static_cast дуже багато різних застосувань. Його ідея полягає в наступному: це обмежений за потужністю C-style cast. Обмеження потрібно тому, що C-style cast може привести що завгодно до чого завгодно (ну, майже), і тим самим може приховати помилку. Наприклад, ви можете випадково закастіть const char * в char *. отримавши креш в деяких системах з апаратної підтримкою const-пам'яті. static_cast вам такого не дозволить.

Велику частину часу, коли ви хочете зробити явне перетворення типів (а я сподіваюся, це буває досить рідко), ви хочете саме static_cast.

Формальний список всього, що вміє static_cast. дуже великий. я приведу лише найбільш важливі речі, які він вміє (а також які він не вміє):

  1. Перетворення покажчика на батьківський клас до покажчика на дочірній клас. Об'єкт за вказівником зобов'язаний бути правильного дочірнього класу, інакше undefined behaviour. Якщо ви не впевнені і хочете перевірити, чи той підклас у об'єкта, користуйтеся dynamic_cast (він спеціально для цього призначений).
  2. Перетворення між числовими типами. int. long. char. unsigned int - все їх можна касти один в одного за допомогою static_cast.
  3. Можна закастіть будь-який вираз в void. Результат буде вирахувано і відкинутий (але побічні ефекти, зрозуміло, виконуватися).
  4. static_cast може привести константу nullptr до будь-якого типу-вказівником. Зазвичай це не потрібно і можна покладатися на неявне перетворення типів, але іноді (наприклад, для вибору потрібної перевантаження функції) таке може стане в нагоді.
  1. Перетворення між покажчиками на в принципі несумісні типи. Наприклад, покажчик на double можна привести до покажчика на int. Для трюків з порушенням type safety користуйтеся reinterpret_cast.
  2. Покажчики на типи, а також самі типи з несумісними атрибутами const і / або volatile. Якщо вам необхідно порушити const-коректність, користуйтеся const_cast.
  3. Зрозуміло, ви не зможете привести покажчик на функцію-член до покажчика на звичайну функцію, або покажчик на код до покажчика на дані. Для подібних брудних хаков користуйтеся reinterpret_cast.

Ще однією причиною використання static_cast (як і інших C ++ - специфічних перетворень типів) є легкість його пошуку в исходниках, як очима, так і пошуковими утилітами. Сішний каст (особливо його функціональну різновид) дуже легко пропустити в коді.

Для порівняння, «звичне» перетворення типів (C-style cast) рівносильно наступній послідовності:

  1. const_cast.
  2. Якщо const_cast не може дати потрібний результат, то static_cast (але з дозволеним перетворенням до недооб'явленному типу)
  3. Якщо і так не виходить, то компілятор пробує в хвіст до static_cast додати const_cast.
  4. Якщо і це не виходить, то reinterpret_cast.
  5. . а якщо не вийде, то до нього дописується const_cast.