警告 C26437
请勿使用切片。
C++ Core Guidelines: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) {
// ...