Bagikan melalui


Peringatan C26432

If you define or delete any default operation in the type 'type-name', define or delete them all (c.21).

Pedoman Inti C++:
=delete

Operasi khusus seperti konstruktor diasumsikan untuk mengubah perilaku jenis sehingga lebih mengandalkan mekanisme bahasa untuk secara otomatis menerapkan skenario tertentu. Contoh kanonis adalah manajemen sumber daya. Jika Anda secara eksplisit menentukan, default, atau menghapus salah satu operasi khusus ini, itu memberi sinyal bahwa Anda ingin menghindari penanganan khusus jenis. Tidak konsisten untuk membiarkan operasi lain tidak ditentukan, yaitu, secara implisit didefinisikan sebagai dihapus oleh pengkompilasi.

Keterangan

Pemeriksaan ini menerapkan aturan lima, yang memperlakukan operasi berikut sebagai khusus:

  • menyalin konstruktor,
  • memindahkan konstruktor,
  • menyalin operator penugasan,
  • memindahkan operator penugasan, dan
  • destruktor.

Aturan tidak memeriksa apakah operasi ditentukan dengan cara yang sama. Tidak apa-apa untuk mencampur operasi yang dihapus dan default dengan operasi yang ditentukan secara eksplisit. Namun, Anda harus menentukan semuanya jika Anda menentukan salah satunya.

Tingkat akses tidak penting dan juga dapat dicampur.

Peringatan menandai definisi fungsi non-statis pertama dari jenis, sekali per jenis.

Contoh

Dalam contoh ini, warning::S hanya menentukan konstruktor default dan destruktor. no_warning::S Deklarasi menentukan atau menghapus kelima fungsi anggota khusus.

// C26432.cpp
namespace warning
{
    struct S
    {
        S() noexcept { ++_count; }
        ~S() { --_count; } // C26432 because only the constructor and destructor are explicitly defined.
        static unsigned _count;
    };
    unsigned S::_count = 0;
}

namespace no_warning
{
    struct S
    {
        S() noexcept { _count++;  }
        S(const S&) = delete;
        S(S&&) = delete;
        S& operator=(const S&) = delete;
        S& operator=(S&&) = delete;
        ~S() { --_count; }
        static unsigned _count;
    };
    unsigned S::_count = 0;
}