Предупреждение 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) {
// ...