Soru Bir kurucu atamaya hiç çağrılmalı mı?


VS2015'te aşağıdaki kodun çıkışı "kurucu" dır.

Eksik görevlendirme operatörü nedeniyle derleme başarısız mıdır?

struct A { };

struct B {
    B(){}
    B(const A& a) {
        cout << "constructor" << endl;
    }

    //B& operator=(const A& a) {
    //  cout << "assignment operator" << endl;
    //  return *this;
    //}
};

int main() {
    A a;
    B b;
    b = a;

    return 0;
}

25
2017-11-07 01:49


Menşei


Bu size göre olacak: stackoverflow.com/questions/3734247/... - SenselessCoder
Ama bunlar A'dan B'ye, gibi herhangi bir dönüşümü işlemiyor değil mi? - bitwise
Şimdi anlıyorum, B'nin A. Apologies'den miras aldığını düşündüm. Bu durumda, garip bir şeyler olduğunu düşünüyorum. Bu derleyici bir şey olabilir. - SenselessCoder


Cevaplar:


Evet, test kutunuzda olduğu gibi bir dönüşüm olduğunda.

Sen etkili bir şekilde arıyorsun

b = B(a);

Çünkü Batama operatörü B& operator=(B const&) örtük olarak bildirilmiştir, aşırı yük çözünürlüğü sırasında bulunur. Ödeviniz bir eşleşme olmaktan yalnızca bir dönüşüm olduğundan (ve tam olarak gerçekleşmesine izin verilen dönüşüm sayısıdır), dönüştürür a için B ve sonra yeni geçici B için b.


29
2017-11-07 01:54





Benzer bir örnek düşünelim.

double a;
int b=5;

a=b;

A atabileceğiniz tek şey double başka mı double. Ancak, bir int bir dönüştürülebilir double.

Aynı şekilde burada A dönüştürülebilir BÇünkü yapıcı bunu yapıyor. Ve olan budur.


13
2017-11-07 01:55



Eh, bir int bir double. Bunun tanımlanmış davranışları int örtülü olarak dönüştürülür double ve bu dönüşümün sonucu, double. Belki de "Saklanabilecek tek şey" demek daha iyi olur. double değişken bir double değeri "veya bir şey. - M.M


Kodunuzda gizli dönüşüm var. A için B, b = a olarak derlenmiş b = B(a);. Bunun hata olarak algılanmasını istiyorsanız, kullanabilirsiniz explicit belirteci:

struct B {
    B(){}
    explicit B(const A& a) {
        std::cout << "constructor" << std::endl;
    }
};

Sonra hata almalısınız ideone.com tarafından oluşturulan bu:

prog.cpp: In function 'int main()':
prog.cpp:20:7: error: no match for 'operator=' (operand types are 'B' and 'A')
     b = a;
       ^
prog.cpp:5:8: note: candidate: B& B::operator=(const B&)
 struct B {
        ^
prog.cpp:5:8: note:   no known conversion for argument 1 from 'A' to 'const B&'
prog.cpp:5:8: note: candidate: B& B::operator=(B&&)
prog.cpp:5:8: note:   no known conversion for argument 1 from 'A' to 'B&&'

Bundan sonra, kurucu hiçbir zaman gizli olarak çağrılmayacak ve eğer onu aramak istiyorsanız, bunu açıkça yazmanız gerekir: b = B(a);


10
2017-11-07 12:51



İyi söz explicit anahtar kelime - Michael