positive lambda

C++ çok hızlı gelişen ve büyüyen bir programlama dili. Dile yeni araçlar eklendikçe dilin olanakları artıyor ve bunun sonucunda da yeni kodlama idiyomları ortaya çıkıyor. Bu idiyomlardan biri de “positive lambda“. Aşağıdaki koda bakalım:

fsquare değişkeninin bildirimi için derleyici tür çıkarımı yapacak. Derleyici açısından, ilk değer veren “lambda ifadesi” kendi oluşturacağı sınıf türünden (closure type) bir geçici nesne (closure object). Bu durumda fsquare derleyici tarafından oluşturulan bir sınıf türünden nesne. C++ dilinin kurallarına göre bir durum bilgisi içermeyen bir lambda ifadesi (stateless lambda), otomatik olarak (implicit conversion) sınıfın sunduğu operatör işlevinin adresine dönüştürülebiliyor:

Şimdi de aşağıdaki koda bakalım:

fptr değişkeninin bildiriminde auto anahtar sözcüğü ile birlikte “*” bildirgeçi kullanılmış. Bu durumda aslında derleyiciye fptr isminin bir pointer türünden değişken olacağını bildiriyor ve derleyiciyi bir adres türüne ilişkin tür çıkarımı yapmaya zorlamış oluyoruz. fsquare ifadesi bir adres olmadığından tür çıkarımı başarısız oluyor.

Aşağıdaki kodda func işlevine yapılan çağrının da geçersiz olma nedeni aynı:

Şimdi de aşağıdaki koda bakalım:

İlginç bir şekilde kapanış nesnelerini (closure objects) işaret operatörü +‘nın operandı yaptığımızda her iki kod da geçerli hale geldi. Peki neden?
C++ dilinin kurallarına görer T bir tür olmak üzere T * türünden her ifade, + işaret operatörünün operandı olabiliyor. Bu durumda eğer işaret + operatörünün operandı bir sınıf nesnesi ise derleyici sınıfın tür dönüşümü gerçekleştirecek bir operatörünün var olup olmadığına bakmak zorunda. Bu süreçte pointer türleri için kullanılabilecek (built-in) + operatörünü de işlev yükleme kümesine (function overloading set) dahil ediyor. Yani artık tür çıkarımı için kullanılacak ifade kapanış nesnesinin türü değil, derleyicinin yaptığı örtülü (implicit) tür dönüşümü ile, kapanış türünün işlev çağrı operatörünü yükleyen işlevin adresi olan

türü. VS derleyicisi ne yazık ki geçerli olan kodlar için sentaks hatası veriyor. Kodları C++ dilinin son standartlarını gerçekleştirmiş GCC ya da clang derleyicilerinden biri ile derlemelisiniz.
Bu durumda derleyici hem işlev şablonu için hem de fp değişkeni için tür çıkarımını yapabiliyor.

Share

Necati Ergin

C ve Sistem Programcıları Derneğinde eğitmen olarak çalışıyor.

Bunlar da ilginizi çekebilir

Kod Eklemek İçin Okuyun