According to the standard (draft)
[class.copy]
3 A non-template constructor for class X is a move constructor if its first parameter is of type X & &, const X & &, volatile X & &, or const volatile X & &, and either there are no other parameters, or all other parameters have arguments by default (8.3.6). [Example: Y :: Y (Y & &) is a move constructor.
Only constructors without templates can be moving constructors. The same goes for copy constructors † . Therefore, an implicit move constructor is created.
You implement the move constructor in the usual way. Specialization will not work, because an implicit move constructor without a pattern is preferred using overload resolution.
† If the type of the argument does not exactly match const T& , however, the template link wins overload resolution. This can easily happen, as can be seen from the example of Praveen.
source share