Gemäß dem Standard (draft)
[class.copy]
3 A Nicht-Template Konstruktor für Klasse X ist eine Bewegung, wenn Konstruktor erste Parameter vom Typ X sind & &, const X & &, flüchtige X & & oder const volatile X & & und entweder gibt es keine weiteren Parameter oder auch alle anderen par Ameters haben Standardargumente (8.3.6). [Beispiel: Y :: Y (Y & &) ist ein Move-Konstruktor.
Nur Nicht-Vorlagenkonstruktoren können Move-Konstruktoren sein. Gleiches gilt für Kopierkonstruktoren †. Daher wird der implizite Move-Konstruktor generiert.
Sie implementieren den Move-Konstruktor auf die übliche Weise. Die Spezialisierung funktioniert nicht, da der implizite Nicht-Template-Move-Konstruktor von der Überladungsauflösung bevorzugt wird.
† Wenn der Argumenttyp nicht exakt mit const T&
übereinstimmt, wird die Überladungsauflösung jedoch durch den Verweis auf die Vorlage erhalten. Dies kann leicht geschehen, wie in Praveens Beispiel zu sehen ist.
Es scheint, dass in gcc zumindest die templated ctor nicht berücksichtigt wird, wenn Sie umziehen: http://coliru.stacked-crooked.com/a/3c995d34b40fb4bc Wenn das der Fall ist nach dem Standard, dann können Sie move ctor in implementieren der übliche Weg. – user2079303