Membuat objek baru kelas C dengan operator baru () memberikan kesalahan di sini:
class C
{
public:
C() {}
virtual ~C() {}
void operator delete(void*) = delete;
};
int main()
{
C* c = new C;
}
dengan C2280: 'void C::operator delete(void *)': function was explicitly deleted
Tetapi ketika saya mengganti C() {}
dengan C() = default;
atau menghapus baris sehingga kompiler menyisipkan konstruktor default (yang saya percaya memiliki efek yang sama dengan = default
), kode akan dikompilasi dan dijalankan.
Apa perbedaan antara konstruktor default yang dibuat kompiler dan konstruktor default yang ditentukan pengguna yang membuat ini terjadi?
Saya mendapat beberapa petunjuk dalam posting ini , tetapi kelas C di sini (tanpa konstruktor yang disediakan pengguna) tidak sepele karena destruktornya virtual, bukan?
Dikompilasi dengan Visual Studio terbaru, c ++ 17.
operator delete()
apakah konstruktor ditulis secara manual atau secara implisit dihasilkan. Yang konsisten dengan harapan saya - karena pengecualian dapat dilemparkan oleh new
ekspresi, kompiler perlu mengakses operator delete()
.
noexcept
akan membuat kompilasi kode, tetapi bagaimana ...?
noexcept
seperti yang disebutkan SebastianRedl, maka panggilan untuk operator delete
tidak perlu disertakan. Juga g ++ tidak hanya mengeluh jika destructor itu virtual. Kalau tidak selalu mengkompilasi, bahkan jika konstruktor melempar.
noexcept