2016-01-22 15 views
6

Bu şablon ctor hareket ctor'unu gizler mi?Evrensel referans gizle taşıma oluşturucusuna sahip şablon kurucu mu?

class A { 
    public: 
     template<typename T> 
     A(T &&t); 

     // move would be as this: 
     /* 
      A(A &&a); 
     */ 
}; 

Peki bu durumda nasıl ctor hareketini uygulamaya koymalıyım? Varsayılan sözdizimi A (A &&) mu yoksa şablon uzmanlığı mı? standardına göre

+1

En azından, gcc'de, harekete geçirildiğinde işaretlenmiş ctorun göz önünde bulundurulmadığı anlaşılıyor: http://coliru.stacked-crooked.com/a/3c995d34b40fb4bc, eğer standarda göre durum buysa, o zaman hareket ctor'unu her zamanki yol. – user2079303

cevap

3

(taslak) ilk parametre, X tipi & arasında ise

[class.copy]

3 sınıfı X için şablon olmayan yapıcı bir hareket yapıcısı &, const X & &, uçucu X & & veya const uçucu X & & ve ya başka hiç diğer parametreler veya tüm diğer par vardır ametreler varsayılan argümanlara sahiptir (8.3.6). [Örnek: Y :: Y (Y & &) bir hareket edicidir.

Yalnızca şablon olmayan yapıcılar kurucuları hareket ettirebilir. Aynı işlem kurucular kopyaları için de geçerlidir. Bu nedenle, örtülü hareket oluşturucu oluşturulur.

Hareket yapıcısını normal şekilde uygularsınız. Uzmanlık işe yaramaz çünkü örtük olmayan şablon hareket ettirici aşırı yüklenme çözünürlüğü tarafından tercih edilir.

Bağımsız değişken türü tam olarak const T& ile eşleşmiyorsa, şablon uygulanmış referans aşırı yük çözünürlüğünü kazanır. Bu Praveen'in örneğinde görüldüğü gibi kolaylıkla gerçekleşebilir.

+1

** Kurucular kopyalamak için de geçerlidir **. 'A2 {a1};' 'copy constructor' yerine' template' işlevini çağırır. niye ya? http://ideone.com/JAfjLy – Praveen

+3

@Praveen, çünkü a1 ''const' değil. Yönlendirme referansları gerçekten açgözlüdür. – TartanLlama

5

Kabul edilen yanıt yanlış. Doğru olduğu halde: template <typename T> A(T &&t) { } bir hareket yapıcısı değil, bunu zaten biliyordunuz. örtülü bu durumda ve normal aşırı yük çözünürlükte bir hareket yapıcısı ilan edecek derleyici beklendiği gibi çalışır:

c taşınıyor gelen a engelleyen hiçbir şey şablon yapıcı bir "hareket" olmadığı halde vardır
A a{2}; // calls template 
A b = std::move(a); // calls move 
A c{a}; // calls template 

yapıcı.

+3

Sorumluluğun şablonun bir taşıt kurucusu olarak sayılmadığını bildiğini nereden biliyorsunuz? Kabul edilen cevapta, herhangi bir hareket edicinin örtülü olarak beyan edilmediği yerde nerededir? (veya kabul edilen cevabın yanlış olduğu şey nedir? – nwp

İlgili konular