Bagikan melalui


Peringatan C26437

Jangan ilis.

Pedoman Inti C++: ES.63: Jangan ikatan

Bahasa ini memungkinkan pemotongan dan dapat dilihat sebagai kasus khusus dari pemeran implisit berbahaya. Bahkan jika itu dilakukan dengan sengaja dan tidak menyebabkan masalah segera, itu masih sangat tidak disarankan. Ini membuat kode lebih sulit diubah, dengan memaksa persyaratan tambahan pada jenis data terkait. Ini terutama benar jika jenis polimorfik atau melibatkan manajemen sumber daya.

Keterangan

Aturan ini memperingatkan tidak hanya pada penugasan eksplisit, tetapi juga pada pemotongan implisit. Pemotongan implisit terjadi ketika hasil dikembalikan dari fungsi saat ini, atau ketika data diteruskan ke fungsi lain.

Aturan ini juga menandai kasus di mana penugasan tidak melibatkan pemotongan data nyata (misalnya, jika jenis kosong atau tidak membuat manipulasi data berbahaya). Peringatan tersebut masih harus diperbaiki untuk mencegah regresi yang tidak diinginkan jika jenis atau perilaku data berubah di masa mendatang.

Contoh

Dalam contoh kode berikutnya, kita membaca id_ex, tetapi pemanggil fungsi hanya akan mendapatkan ikatan objek:

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;
}

Untuk memperbaiki masalah, perbarui fungsi untuk menggunakan jenis yang benar:

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