Задать вопрос
Dyikot
@Dyikot

Неверное приведение типа через static_cast это UB или его чтение/изменение это UB?

Допустим есть базовый класс StyleableElement. Мне нужно от него два метода. Но проблема такая что тип не полный. И соответсвеенно напрямую я не могу его получить.
Есть для примера следующая функция в шаблонном классе:
void SaveBaseState(StyleableElement& stateOwner, StyleableElement& target) const override
{
    auto& owner = static_cast<TOwner&>(stateOwner);

    if(!owner.HasBaseState(_property)) // UB или нет?
    {
        // other code
    }
}

TOwner это всегда минимум StyleableElement.
Например пусть:
Тип stateOwner - Button, а TOwner - TextBlock. т.е типы не совместимы но при этом они оба StyleableElement. И если я потом вызываю у owner метод класса StyleableElement, то будет UB или нет.

Варианты так не делать (но мне теоритически интересно UB это или нет) тоже есть. По крайней мере я придумал два:
1) Интерфейс
2) Вместо методов использывать friend функции и объявить их в начале заголовочного файла. (почему так нельзя и объявить методы не понимаю)
  • Вопрос задан
  • 121 просмотр
Подписаться 1 Простой 2 комментария
Помогут разобраться в теме Все курсы
  • Нетология
    Разработчик на C++
    12 месяцев
    Далее
  • Академия Эдюсон
    Разработчик игр на Unreal Engine: тариф Базовый
    9 месяцев
    Далее
  • Яндекс Практикум
    Разработчик C++ расширенный
    12 месяцев
    Далее
Решения вопроса 1
opium
@opium
Просто люблю качественно работать
Да, UB уже в момент каста. static_cast не делает рантайм-проверку типа (в отличие от dynamic_cast), и если объект реально не TOwner, ссылка невалидна сразу. То что ты потом дёргаешь только базовые методы ничего не спасает — компилятор вправе считать каст валидным и оптимизировать на этом основании. Интерфейс нормальный подход, friend-функции тоже ок.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы