2011-04-11 31 views
7

İki şablonu atama operatörü aşırı ayırt basit yapı Wrapper var const olmayan şablon atama operatörü yukarıdan aşırı yüklenir ve "2" sayısı görüntülenir. Şablon atama operatörü aşırı gizem

Beni hayrete şudur: Ben c ve d,

Wrapper<float> c; 
const Wrapper<float> d; 
c = d; 

beyan ve c için d, iki atama operatörü aşırı hiçbiri kullanılır atayabilir ve hiçbir çıkış görüntülenirse; Böylece varsayılan kopya atama operatörü çağrılır. d'un c'a atanması neden verilen aşırı yüklenme ataması operatörünü kullanmıyor? Veya bunun yerine, a için varsayılan kopyalama atama işlecini kullanmıyorsunuz?

cevap

18

Neden atama operatörü sağlanan aşırı yüklenmiş const kullanmayın c için d atama geliyor?

şöyle bildirildi örtülü ilan kopya atama operatörü, hala oluşturulur:

Wrapper& operator=(const Wrapper&); 

Bir operatör şablon örtük ilan kopya atama operatörünün nesil bastırmak etmez. Argüman (bir kalifiye nitelikli Wrapper) bu operatörün parametresi için tam bir eşleşme olduğundan (const Wrapper&), aşırı yüklenme çözünürlüğü sırasında seçilir.

Operatör şablonu seçili değildir ve herhangi bir belirsizlik yoktur, çünkü - tüm diğer şeyler eşittir - bir şablon, bir şablondan daha yüksek bir aşırı yük çözünürlüğü eşleşmesidir.

ba için neden atama varsayılan kopyalama atama işlecini kullanmıyor?

argüman (bir const olmayan nitelikli Wrapper) itibaren bir const Wrapper<U>&.

+1

+1 * Bir operatör şablonu, örtülü olarak bildirilen kopya ataması operatörünün oluşturulmasını engellemez *. – Nawaz

6

alır örtülü ilan kopya atama operatörü için daha Wrapper<U>& (sürer operatör şablonu için daha iyi bir eşleşme olduğunu C++ 03 standart, §12.8/9:

bir kullanıcı beyan kopya atama operatörü X::operator= tam olarak bir sınıfa X olmayan bir statik şablon olmayan üye işlevi olan

X, X&, const X&, volatile X& veya const volatile X& parametresinin parametresi.

Ve §12.8/10:

Sınıf tanımı, bir kopya atama işlecini açıkça bildirmezse, biri örtülü olarak bildirilir.

sizin operator= bir şablon o değil bir kopyası atama operatörü yapar, bu nedenle sınıf örtülü kopya atama operatörü hala derleyici tarafından üretilen olması.

+0

Eğer bir kopyalama görevlendirme operatörü değilse? Öyleyse bunun yerine ne yapmanız gerekiyor - sadece bir CopyFrom fonksiyon şablonunu veya bunun gibi bir şey yapmalısınız? –

+0

@DavidDoria: Bir _copy_ atama işleci değil, bir atama operatörüdür. – ildjarn

İlgili konular