警告 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) {
// ...