การสร้างออบเจ็กต์ใหม่ของคลาส C โดยมีโอเปอเรเตอร์ new () ให้ข้อผิดพลาดที่นี่:
class C
{
public:
C() {}
virtual ~C() {}
void operator delete(void*) = delete;
};
int main()
{
C* c = new C;
}
กับ C2280: 'void C::operator delete(void *)': function was explicitly deleted
แต่เมื่อฉันแทนที่C() {}
ด้วยC() = default;
หรือลบบรรทัดเพื่อให้คอมไพเลอร์แทรกตัวสร้างเริ่มต้น (ซึ่งฉันเชื่อว่ามีผลเหมือนกันกับ= default
) รหัสจะรวบรวมและเรียกใช้
อะไรคือความแตกต่างระหว่างตัวสร้างเริ่มต้นที่คอมไพเลอร์ที่สร้างโดยผู้ใช้ที่กำหนดโดยค่าเริ่มต้นที่ทำให้สิ่งนี้เกิดขึ้น?
ฉันได้รับคำแนะนำบางอย่างในการโพสต์นี้แต่คลาส C ที่นี่ (ไม่มีคอนสตรัคเตอร์ที่ผู้ใช้ให้) ไม่น่าสนใจเลยเพราะ destructor เป็นเสมือนจริงใช่ไหม
คอมไพล์ด้วย Visual Studio ล่าสุด c ++ 17
operator delete()
ว่าคอนสตรัคถูกเขียนด้วยตนเองหรือสร้างขึ้นโดยปริยาย ซึ่งสอดคล้องกับความคาดหวังของฉัน - ตั้งแต่ข้อยกเว้นอาจจะโยนโดยการแสดงออกของคอมไพเลอร์ต้องการที่จะเข้าถึงnew
operator delete()
noexcept
จะทำให้การคอมไพล์รหัส แต่อย่างไร ... ?
noexcept
ตามที่ SebastianRedl พูดถึงคุณoperator delete
ไม่จำเป็นต้องรวมการเรียกไปยัง นอกจากนี้ g ++ จะบ่นเฉพาะเมื่อ destructor นั้นเป็นเสมือน มิฉะนั้นจะรวบรวมทุกครั้งแม้ว่าตัวสร้างจะขว้าง
noexcept