yüklenmiş işlev çözümlemesinde özel durumlar – 2

Yüklenmiş işlev çözümlemesinde kodlayıcıların canını yakabilecek bir durum var. Aşağıdaki kodu inceleyin:

Yukarıdaki kodda main işlevi içinde f isimli işleve yapılan çağrının Myclass * parametreli f işlevi için yapıldığını düşünelim. Bu işleve null gösterici (null pointer) geçilmesinin özel bir anlamı olsun. Kodlayıcımız işleve null gösterici göndermek için işlevi 0 sabitiyle çağırmış olsun. int türden 0 tamsayı sabitinin NULL gösterici dönüşümüyle bir gösterici parametreye aktarılması “tam uyum” ya da yükseltme olmayan bir standart dönüşüm. Kodlayıcımızın belki de diğer yüklemeden (overload) haberi yok. Oysa aynı bilinirlik alanında paramertesi int türden olan f isimli bir işlev daha var. Yüklenmiş işlev çözümlemesi kurallarına göre bu işlev için yapılan standart dönüşüm (standard conversion) tam uyum (exact match) kategorisinde. Her iki işlev için de standart dönüşüm söz konusu ancak tam uyum, dönüşüme (conversion) göre daha yüksek dereceye (rank) sahip. Kodlayıcının beklentisinden farklı olarak çağrılan int parametreli işlev olacak.

C++11 standartlarıyla dile eklenen  nullptr_t türünün ve bu türden nullptr sabitinin varlık nedenlerinden birisi bu. nullptr_t türünden tamsayı türlerine otomatik tür dönüşümü yok. Yani eger f işlevi C++11‘de

biçiminde çağrılsaydı int parametreli f işlevi uygun (viable) olmayacak ve bu durumda Myclass * parametreli f işlevi çağrılacaktı.

Aşağıdaki senaryoda kodlayıcımız daha şanslı olacaktı:

Yukarıdaki kodda yine main işlevi içinde f isimli işlev int türden 0 sabiti ile çağrılıyor. Bu kez ikinci f işlevinin parametresi double türden. int türden bir değerin double türüne dönüştürülmesi artık tam uyum ya da yükseltme (promotion) olmayan bir standart dönüşüm.  f isimli işlevin iki yüklemesi arasında seçilebilirlik açısından bir fark yok. Derleyici çağrıyı çift anlamlılık hatası olarak (ambiguity) değerlendirecek.

Kıssadan hisse:
null gösterici olarak artık ne int türden 0 değerini ne de NULL makrosunu kullanın. Sadece ve sadece nullptr sabitini (anahtar sözcüğünü) kullanın.

Necati Ergin

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

Bunlar da ilginizi çekebilir

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Kod Eklemek İçin Okuyun