Ответ
static_cast — это оператор явного преобразования типов, проверяемый на этапе компиляции. Он используется для "разумных" и относительно безопасных преобразований, где логика преобразования ясна из контекста кода.
Основные сценарии применения:
-
Преобразование между числовыми типами (например,
intвfloat,enumвint).int i = 42; double d = static_cast<double>(i); // Явное указание на сужение/расширение -
Явное преобразование вниз по иерархии наследования (downcast), когда программист уверен в типе объекта. Если уверенности нет, следует использовать
dynamic_castс проверкой.class Base { virtual ~Base() = default; }; class Derived : public Base { /*...*/ }; Base* basePtr = new Derived; // Безопасно только если мы ЗНАЕМ, что basePtr указывает на Derived Derived* derivedPtr = static_cast<Derived*>(basePtr); -
*Преобразование из `void`** обратно в исходный тип указателя, когда тип известен.
int value = 10; void* genericPtr = &value; int* intPtr = static_cast<int*>(genericPtr); // Восстановление типа -
Подавление предупреждений компилятора о неиспользуемых переменных или параметрах (альтернатива
(void)var).[[maybe_unused]] int unused = 5; // Предпочтительный способ (C++17) static_cast<void>(unused); // Альтернативный способ -
Вызов explicit-конструкторов или преобразующих операторов.
class MyString { public: explicit MyString(const char*); // explicit-конструктор }; MyString s = static_cast<MyString>("hello"); // Ок, явный вызов
Чего НЕ делает static_cast:
- Не выполняет проверку типов во время выполнения (это
dynamic_cast). - Не преобразует между указателями на несвязанные типы (это
reinterpret_cast). - Не снимает константность или волатильность (это
const_cast).