SORU
29 Kasım 2011, Salı


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
29 Kasım 2011, Salı


İ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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • metagamers

    metagamers

    13 Mayıs 2006
  • Project Mooncircle

    Project Moon

    6 Aralık 2009
  • Snazzy Labs

    Snazzy Labs

    9 Aralık 2008