Genel olarak, bir işlevi kullanılamaz hale getirmeyi ifade eder, örneğin, bir programda dinamik ayırmanın kullanımını yasaklamak istiyorsanız, malloc
işlevi "zehirleyerek" kullanılamaması için "zehirleyebilirsiniz" .
Videoda bunu daha spesifik bir şekilde kullanıyor. Bu, işlevi zehirlemekten bahsederken görüntülenen slaydı okursanız, "Yalnızca derleme zamanını zorlamanın bir yolu mu?"
Bu nedenle, işlevi çalışma zamanında çağrılamaz hale getirmek için "zehirlemekten" bahsediyor, bu nedenle yalnızca sabit ifadelerde çağrılabilir. Teknik, işlevde derleme zamanı bağlamında çağrıldığında asla alınmayan bir dalın olması ve bu dalın bir hataya neden olacak bir şey içermesini sağlamaktır.
Bir throw
constexpr işlevinde bir ifadeye, işlevin derleme zamanı çağrısı sırasında asla ulaşılmadığı sürece izin verilir (çünkü derleme zamanında bir istisna atamazsınız, bu, bellek ayırma gibi, doğası gereği dinamik bir işlemdir). Bu nedenle tanımlanmamış bir sembole atıfta bulunan bir atma ifadesi, derleme zamanı çağrıları sırasında kullanılmaz (çünkü bu derleme başarısız olur) ve tanımsız sembol bir bağlayıcı hatasına neden olduğundan çalışma zamanında kullanılamaz.
Tanımlanmamış sembol, fonksiyonun derleme zamanı çağrılmasında "odr tarafından kullanılmış" olmadığından, pratikte derleyici sembole bir referans oluşturmayacaktır, bu nedenle tanımsız olması sorun değildir.
Bu yararlı mı? Bunun nasıl yapılacağını gösteriyor , bunun iyi bir fikir olduğunu veya yaygın olarak yararlı olduğunu söylemiyor. Herhangi bir nedenle bunu yapmanız gerekiyorsa, tekniği probleminizi çözebilir. İhtiyacınız yoksa endişelenmenize gerek yok.
O bir nedeni olabilir bazı operasyonun derleme zamanı sürüm değil olması gerektiği kadar etkili olduğu zaman uygun bir çözüm olabilir. Bir constexpr işlevinde izin verilen ifade türlerinde kısıtlamalar vardır (özellikle C ++ 11'de, C ++ 14'te bazı kısıtlamalar kaldırılmıştır). Dolayısıyla, bir hesaplama yapmak için bir işlevin iki sürümüne sahip olabilirsiniz, biri optimal olan, ancak bir constexpr işlevinde izin verilmeyen ifadeler kullanan ve diğeri de geçerli bir constexpr işlevi olan, ancak çalıştırıldığında çağrılırsa kötü performans gösterir zaman. Çalışma zamanı çağrıları için asla kullanılmamasını sağlamak için optimumun altında olanı zehirleyebilir ve çalışma zamanı çağrıları için daha verimli (constexpr olmayan) sürümün kullanılmasını sağlayabilirsiniz.
NB Derleme zamanında kullanılan bir constexpr işlevinin performansı gerçekten önemli değildir, çünkü zaten çalışma zamanı ek yükü yoktur. Derleyicinin fazladan iş yapmasını sağlayarak derlemenizi yavaşlatabilir, ancak herhangi bir çalışma zamanı performans maliyeti olmayacaktır.