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 newekspresi, kompiler perlu mengakses operator delete().
noexceptakan membuat kompilasi kode, tetapi bagaimana ...?
noexceptseperti yang disebutkan SebastianRedl, maka panggilan untuk operator deletetidak perlu disertakan. Juga g ++ tidak hanya mengeluh jika destructor itu virtual. Kalau tidak selalu mengkompilasi, bahkan jika konstruktor melempar.
noexcept