Akraba iseler
Bir an için bunun B
aslında bir temel olduğunu varsayalım D
. Daha sonra çağrı için check
, her iki sürüm de uygulanabilir çünkü veHost
biçimine dönüştürülebilir . Bu, sırasıyla ve arasında ile açıklandığı gibi kullanıcı tanımlı bir dönüşüm dizisidir . Sınıfı dönüştürebilen dönüştürme fonksiyonlarını bulmak için, aşağıdaki aday fonksiyonlar ilk fonksiyona göre sentezlenir .D*
B*
13.3.3.1.2
Host<B, D>
D*
B*
check
13.3.1.5/1
D* (Host<B, D>&)
İlk dönüştürme işlevi bir aday B*
değildir çünkü dönüştürülemez D*
.
İkinci işlev için aşağıdaki adaylar mevcuttur:
B* (Host<B, D> const&)
D* (Host<B, D>&)
Bunlar, ana bilgisayar nesnesini alan iki dönüştürme işlevi adayıdır. Birincisi onu const referansıyla alır, ikincisi almaz. Böylece ikincisi, const olmayan *this
nesne ( örtük nesne argümanı ) için daha iyi bir eşleşmedir ve ikinci işleve 13.3.3.2/3b1sb4
dönüştürmek için kullanılır .B*
check
Eğer istiyorsanız kaldırmak const, aşağıdaki adayları olurdu
B* (Host<B, D>&)
D* (Host<B, D>&)
Bu, artık sabitlikle seçim yapamayacağımız anlamına gelir. Sıradan bir aşırı yük çözümleme senaryosunda, normal olarak dönüş türü aşırı yük çözümlemesine katılmayacağı için çağrı artık belirsiz olacaktır. Ancak dönüştürme işlevleri için bir arka kapı vardır. İki dönüşüm işlevi eşit derecede iyi ise, o zaman bunların dönüş türü kimin en iyi olduğuna karar verir 13.3.3/1
. Eğer const kaldırmak olsaydı Böylece, daha sonra ilk, çünkü alınacağını B*
dönüştürür daha iyi B*
daha D*
için B*
.
Şimdi hangi kullanıcı tanımlı dönüşüm sırası daha iyidir? İkinci kontrol işlevi için mi yoksa ilk kontrol işlevi için mi? Kural, kullanıcı tanımlı dönüşüm dizilerinin ancak aynı dönüştürme işlevini veya yapıcıyı kullanmaları durumunda karşılaştırılabilmesidir 13.3.3.2/3b2
. Buradaki durum tam olarak budur: Her ikisi de ikinci dönüştürme işlevini kullanır. Bu nedenle const'ın önemli olduğuna dikkat edin çünkü derleyiciyi ikinci dönüştürme işlevini almaya zorlar.
Onları karşılaştırabildiğimize göre - hangisi daha iyi? Kural, dönüştürme işlevinin dönüş türünden hedef türüne daha iyi dönüşümün kazanmasıdır (yine ile 13.3.3.2/3b2
). Bu durumda, D*
yerine D*
daha iyi dönüşür B*
. Böylece ilk işlev seçilir ve kalıtımı tanırız!
Biz ihtiyacım olmadı çünkü o Bildirimi aslında bir temel sınıf dönüştürmek, biz böylece tanıyabilir özel miras biz dönüştürebilirsiniz edip, çünkü D*
bir hiç B*
uygun miras şeklinde bağlı değildir4.10/3
İlişkili değillerse
Şimdi bunların kalıtımla ilişkili olmadığını varsayalım. Böylece ilk işlev için aşağıdaki adaylara sahibiz
D* (Host<B, D>&)
Ve ikinci için şimdi başka bir setimiz var
B* (Host<B, D> const&)
Dönüştürdüğümüz olamaz yana D*
hiç B*
bir miras ilişkisi yoksa eğer, şimdi iki kullanıcı tanımlı dönüşüm dizileri arasında hiçbir ortak dönüşüm fonksiyonu var! Bu nedenle, ilk işlevin bir şablon olduğu gerçeği olmasaydı belirsiz olurduk . Şablonlar, göre eşit derecede iyi olan şablon olmayan bir işlev olduğunda ikinci tercihtir 13.3.3/1
. Böylece, şablon olmayan işlevi (ikincisi) seçeriz B
ve ve arasında kalıtım olmadığını anlarız D
.