Bir işlevi aynı constexpr
zamanda 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).
inline
sırayla, bu işlevin tanımını, kullanılabileceği her çeviri birimine eklemeniz gerektiği anlamına gelir. Bu temelde constexpr
iş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 constexpr
fonksiyon 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
try
blok 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 goto
bir asm
deyim 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.