Neden C 11 constexpr o kadar sınırlıdır ki?
Bildiğiniz gibi, C 11 constexpr
anahtar tanıtır.
C 11 kullanıcı sağlayan anahtar kelime constexpr tanıttı fonksiyon veya nesne yapıcı olduğunu garanti zamanı derleme sürekli. [...] Bu derleyici anlamak, ve o [fonksiyon adı] olduğunu doğrulamak için izin verir derleme zamanı sabiti.
Benim sorum var bildirilebilir işlevleri formda böyle sıkı kısıtlamalar vardır. İşlevi saf olmasını istemenizi anlıyorum, ama bu göz önünde bulundurun:
Bir işlev constexpr kullanımı konusunda bazı sınırlamalar getirmektedir bu işlev yapabilir.
First, the function must have a non-void return type. Second, the function body cannot declare variables or define new types. Third, the body may only contain declarations, null statements and a single return statement. There must exist argument values such that, after argument substitution, the expression in the return statement produces a constant expression.
Bu saf fonksiyon yasadışı olduğu anlamına gelir:
constexpr int maybeInCppC1Y(int a, int b)
{
if (a>0)
return a b;
else
return a-b;
//can be written as return (a>0) ? (a b):(a-b); but that isnt the point
}
Ayrıca yerel değişkenler tanımlamak cant... :( Bir tasarım kararı bu, ben de merak ettim, ya da Derleyiciler ispat işlevi söz konusu olduğunda berbat bir saf mı?
CEVAP
İfadeler yerine ifadeleri yazmak lazım nedeni tabloların ek yetenekler, özellikle döngü yeteneği yararlanmak istiyorum. Ama yararlı olabilmesi için, bu değişkenleri (yasak) ilan yeteneği gerektirir.
Eğer değişken değişken ile döngü için bir tesis birleştirirseniz, mantıksal dallanma (if
tabloları gibi) o zaman sonsuz döngü oluşturmak için yeteneği var. Mümkünse böyle bir döngü hiç (the halting problem) sona erecek olup olmadığını belirlemek için değil. Böylece bazı kaynaklar, derleyici askıda kalmasına neden olur.
Özyinelemeli saf fonksiyonları kullanarak benzer döngü yetenekleri yukarıda açıklanan güçlü olarak gösterilebilir sonsuz özyineleme, neden olanaklıdır. Ancak, C zaten derleme zamanında böyle bir sorun var - şablon genişlemesi ile oluşur ve bu yüzden Derleyiciler zaten bir geçiş var "şablonu derinlik vermek için zaman tanıyorlar". yığını
Kısıtlamalar bu sorun (eğer C bir derleme biter belirleme) işin daha thornier almaz sağlamak için tasarlanmış gibi görünüyor.
Neden&; dizi yineleme için... "* o kad...
Neden `1000000000000000 aralığı(100000...
Neden C derleme bu kadar uzun sürüyor?...
Neden tanıtan bir işe yaramaz MOV tali...
Neden bu kadar asal sayının Kare kökün...