Bir işlevi aynı constexprzamanda bir satır içi işlevi olarak işaretlemek, § [dcl.constexpr] / 1:
Constexpr belirteci ile bildirilen bir işlev veya statik veri üyesi dolaylı olarak bir satır içi işlev veya değişkendir (7.1.6).
inlinesırayla, bu işlevin tanımını, kullanılabileceği her çeviri birimine eklemeniz gerektiği anlamına gelir. Bu temelde constexprişlevlerden birinin olması gerektiği anlamına gelir :
- bir çeviri biriminde kullanımı kısıtlanmışsa veya
- bir başlıkta tanımlanmıştır.
Bir başlıkta bildirmek ve bir kaynak dosyada tanımlamak istediğiniz en tipik işlevler (ve bunları kullanan herhangi bir şey yalnızca başlığı içerir, o zaman o kaynağın nesne dosyasına karşı bağlanır) constexprçalışmaz.
Teoride, her şeyi başlıklara taşıyabileceğinizi ve sadece tüm başlıkları içeren tek bir kaynak dosyasına sahip olabileceğinizi varsayalım, ancak bu derleme zamanlarını büyük ölçüde incitir ve çoğu ciddi proje için çok fazla miktarda bellek derlemek ister.
Bir constexprfonksiyon bazı şekillerde de sınırlıdır, bu nedenle bazı fonksiyonlar için bir seçenek olmayabilir. Kısıtlamalar şunları içerir:
- sanal fonksiyonlar olamaz olmak
constexpr.
- onun geri dönüş tipi 'değişmez tür' olmalıdır (örneğin, trival olmayan veya dtorsu olmayan nesneler yok).
- parametrelerinin tümü değişmez türler olmalıdır.
- fonksiyon gövdesi bir
tryblok içeremez .
- değişmez bir türün değişken tanımını veya statik veya iş parçacığı saklama süresi olan herhangi bir şeyi içeremez.
Bir çiftin üstünden atladım, belirsiz şeyleri atladım (örneğin, ayrıca gotobir asmdeyim içeremez ), ama siz bir fikre kapılıyorsunuz - epeyce şey için, işe yaramayacak.
Alt satır: evet, bunun kötü bir fikir olacağı birkaç durum var.