Kapan / mengapa saya ingin menghapus konstruktor saya secara eksplisit? Dengan asumsi alasannya adalah untuk mencegah penggunaannya, mengapa tidak dibuat saja private?
class Foo
{
public:
Foo() = delete;
};
Kapan / mengapa saya ingin menghapus konstruktor saya secara eksplisit? Dengan asumsi alasannya adalah untuk mencegah penggunaannya, mengapa tidak dibuat saja private?
class Foo
{
public:
Foo() = delete;
};
delete. Baik pertanyaan maupun jawaban Luchian dengan mudah bisa dianggap konstruktif. Siapa pun yang tidak menghirup poin-poin penting dari C ++ 11 tetapi perlu segera akan mendapatkan sesuatu dari keduanya.
Jawaban:
Bagaimana tentang:
//deleted constructor
class Foo
{
public:
Foo() = delete;
public:
static void foo();
};
void Foo::foo()
{
Foo f; //illegal
}
melawan
//private constructor
class Foo
{
private:
Foo() {}
public:
static void foo();
};
void Foo::foo()
{
Foo f; //legal
}
Mereka pada dasarnya berbeda. privatememberitahu Anda bahwa hanya anggota kelas yang dapat memanggil metode itu atau mengakses variabel itu (atau teman tentu saja). Dalam hal ini, sah untuk staticmetode kelas itu (atau anggota lain) untuk memanggil privatekonstruktor kelas. Ini tidak berlaku untuk konstruktor yang dihapus.
Cicipi di sini .
mengapa secara eksplisit menghapus konstruktor?
Alasan lain:
Saya gunakan deleteketika saya ingin memastikan bahwa kelas dipanggil dengan penginisialisasi. Saya menganggapnya sebagai cara yang sangat elegan untuk mencapai ini tanpa pemeriksaan runtime.
Kompiler C ++ melakukan pemeriksaan ini untuk Anda.
class Foo
{
public:
Foo() = delete;
Foo(int bar) : m_bar(bar) {};
private:
int m_bar;
}
Kode - sangat disederhanakan - ini memastikan bahwa tidak ada contoh seperti ini:Foo foo;
Foomemiliki banyak konstruktor, bukan yang default, maka Foo foo;akan menyebabkan kesalahan yang lebih lama yang mencantumkan semua konstruktor yang didefinisikan secara implisit, dilindungi, dan privat yang gagal dicocokkan.
Saya telah bertemu dengan ctors default yang dideklarasikan sebagai 'dihapus' di kode sumber LLVM (di AlignOf.h misalnya). Templat kelas terkait biasanya dalam namespace khusus yang disebut 'llvm :: detail'. Seluruh tujuan di sana saya pikir adalah bahwa mereka menganggap kelas itu hanya sebagai kelas penolong. Mereka tidak pernah bermaksud untuk memberi contoh; hanya untuk menggunakannya dalam konteks template kelas lain dengan beberapa trik metaprogramming yang berjalan dalam waktu kompilasi.
Misalnya. ada template kelas AlignmentCalcImpl yang hanya digunakan dalam template kelas lain yang disebut AlignOf sebagai parameter untuk operator sizeof (.). Ekspresi tersebut dapat dievaluasi dalam waktu kompilasi; dan tidak perlu membuat contoh template -> jadi mengapa tidak mendeklarasikan ctor delete default untuk mengekspresikan maksud ini.
Tapi itu hanya asumsi saya.
= default, bahkan kelas tidak dapat menggunakannya, dan saya pribadi lebih suka melihat Penggunaan fungsi yang dihapus. lebih dari Fungsi bersifat pribadi. Yang pertama secara eksplisit menyatakan "Ini tidak dimaksudkan untuk digunakan." Jika ada yang keluar dari itu, kelas tidak dapat menggunakannya sebenarnya membuat perbedaan semantik.