В каких случаях следует использовать static_cast в C++?

«В каких случаях следует использовать static_cast в C++?» — вопрос из категории C++ Core, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

static_cast — это оператор явного преобразования типов, проверяемый на этапе компиляции. Он используется для "разумных" и относительно безопасных преобразований, где логика преобразования ясна из контекста кода.

Основные сценарии применения:

  1. Преобразование между числовыми типами (например, int в float, enum в int).

    int i = 42;
    double d = static_cast<double>(i); // Явное указание на сужение/расширение
  2. Явное преобразование вниз по иерархии наследования (downcast), когда программист уверен в типе объекта. Если уверенности нет, следует использовать dynamic_cast с проверкой.

    class Base { virtual ~Base() = default; };
    class Derived : public Base { /*...*/ };
    
    Base* basePtr = new Derived;
    // Безопасно только если мы ЗНАЕМ, что basePtr указывает на Derived
    Derived* derivedPtr = static_cast<Derived*>(basePtr);
  3. *Преобразование из `void`** обратно в исходный тип указателя, когда тип известен.

    int value = 10;
    void* genericPtr = &value;
    int* intPtr = static_cast<int*>(genericPtr); // Восстановление типа
  4. Подавление предупреждений компилятора о неиспользуемых переменных или параметрах (альтернатива (void)var).

    [[maybe_unused]] int unused = 5; // Предпочтительный способ (C++17)
    static_cast<void>(unused);       // Альтернативный способ
  5. Вызов explicit-конструкторов или преобразующих операторов.

    class MyString {
    public:
        explicit MyString(const char*); // explicit-конструктор
    };
    MyString s = static_cast<MyString>("hello"); // Ок, явный вызов

Чего НЕ делает static_cast:

  • Не выполняет проверку типов во время выполнения (это dynamic_cast).
  • Не преобразует между указателями на несвязанные типы (это reinterpret_cast).
  • Не снимает константность или волатильность (это const_cast).