Share via


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