New () operatörü ile C sınıfı yeni bir nesne oluşturmak burada bir hata verir:
class C
{
public:
C() {}
virtual ~C() {}
void operator delete(void*) = delete;
};
int main()
{
C* c = new C;
}
ile C2280: 'void C::operator delete(void *)': function was explicitly deleted
Ancak
, derleyici C() {}
ile değiştirdiğimde C() = default;
veya kaldırdığımda, derleyici varsayılan bir yapıcı eklediğinde (ki aynı etkiye sahip olduğuna inanıyorum = default
), kod derlenecek ve çalışacaktır.
Derleyici tarafından oluşturulan varsayılan kurucu ile bunu yapan kullanıcı tanımlı varsayılan kurucu arasındaki farklar nelerdir?
Ben bazı ipucu var bu gönderme , ama burada sınıf C yoketme, sağ sanal olduğundan önemsiz değil (kullanıcı tarafından sağlanan yapıcı olmadan)?
En son Visual Studio, c ++ 17 ile derlenmiştir.
operator delete()
el ile yazılması veya örtük olarak üretilmesi ile ilgili benzer teşhis . Bu benim beklentilerimle tutarlı - new
ifade tarafından bir istisna atılabileceğinden , derleyicinin erişmesi gerekiyor operator delete()
.
noexcept
kod derleme yapacak, ama nasıl ...?
noexcept
SebastianRedl'in belirttiği gibi ise , bir çağrı operator delete
dahil edilmesine gerek yoktur. Ayrıca g ++ sadece yıkıcı sanal ise şikayetçi olur. Aksi halde, yapıcı fırlatsa bile her zaman derler.
noexcept