2013-06-06 19 views
10

Aşırı derecede belirsiz bir başlık için özür dilerim (İngilizce becerememin eksikliğinden dolayı). Lütfen daha iyi bir başlık öneriniz.Neden kurucu kopyalanmıyor?

Lütfen aşağıdaki kodu dikkate alın.

struct A { 
    typedef std::vector<double> State; 

    // template <class... Args> 
    // A(Args... args) 
    //  : a(args...) 
    // {} 

    template <class... Args> 
    A(Args&&... args) 
      : a(std::forward<Args>(args)...) 
    {} 

    A(const A&) = default; 
    A(A&&) = default; 

    State a; 
}; 

int main(){ 

    A a(3,2); 
    A b = a; // This line triggers an error!! 
} 

gcc 4.8.0 hata mesajı error: no matching function for call to 'std::vector<double>::vector(A&)' : a(std::forward<Args>(args)...) ile derlemek başarısız oldu.

Bu kodun neden yanlış olduğunu anlayamıyorum. Bence derleyici, A b = a; numaralı hattaki kopya kurucuyu çağırmalıdır. Ancak, kurucuyu, yorumlanana göre değiştirirseniz (bu yalnızca değerleri alır). Derleme yapar. Ayrıca, şimdi varsayılan kopyalama (ve taşıma) kurucularına gerek yoktur. Burada ne oluyor?

cevap

9

kopya kurucu çağırır herhangi bir cv kalifikasyonu ile herhangi bir türle eşleşen, bir referans değeri veya bir referans değeri olsun, evrensel bir referans oluşturur.

Yani sizin durumunuzda bir A ileterek ve konum dolayısıyla Args... = A &, derleyici değil, çünkü const A & daha iyi bir eşleşme referans-çöken kurallara A & sayesinde Args &&... = A & &&, const olmayan bir değişkene constness eklemeniz gerekir.

+1

Oh, anlıyorum. Net açıklama için teşekkürler. :) – Sungmin

3

Bu durumda, şablon yapıcısı, const olmayan değer aldığından daha iyi bir eşleşme olduğunu düşünüyorum. Eğer const için a değiştirmek eğer derleyici otomatik olarak (bir şablonu yapıcısı ile yapmak gerekir gibi) şablon parametreleri anlamak ve türüne && uygulayarak sahip C++ 11 yılında ...

const A a(3,2); 
A b = a; 
+0

Başka bir kopya oluşturucu eklediğimde 'A (A &) = default') teşekkürler. İyi derler. :) – Sungmin

İlgili konular