Поделиться через


Предупреждение C26437

Не срезайте.

Основные рекомендации по C++ : ES.63: не срезайте

Язык разрешает срезы и может рассматриваться как особый случай опасного неявного приведения. Даже если это сделано намеренно и не приводит к немедленным проблемам, это все еще очень не рекомендуется. Это затрудняет изменение кода, заставляя дополнительные требования к связанным типам данных. Это особенно верно, если типы являются полиморфными или включают управление ресурсами.

Замечания

Это правило предупреждает не только о явных назначениях, но и о неявном срезе. Неявное срезы происходит, когда результат возвращается из текущей функции или когда данные передаются другим функциям.

Правило также помечает случаи, когда назначение не включает в себя срез реальных данных (например, если типы пусты или не выполняют опасные манипуляции с данными). Такие предупреждения по-прежнему должны быть исправлены, чтобы предотвратить нежелательные регрессии, если типы данных или поведение изменяются в будущем.

Пример

В следующем примере кода мы считаем id_ex, но вызывающий объект будет получать только срез объекта:

struct id {
    int value;
};

struct id_ex : id {
    int extension;
};

bool read_id(stream &s, id &v) {
    id_ex tmp{};
    if (!s.read(tmp.value) || !s.read(tmp.extension))
        return false;

    v = tmp; // C26437
    return true;
}

Чтобы устранить проблему, обновите функцию, чтобы использовать правильные типы:

// ...
bool read_id(stream &s, id_ex &v) {
// ...