This page表明std::shared_ptr
具有模板化和非模板化版本的复制/移动构造函数(页面上的(9)和(10))。同样,它还有两个版本的复制/移动赋值运算符(参见here)。
为什么我们需要非模板化版本?模板化的版本不足以满足要求吗?
答案 0 :(得分:3)
模板化版本不是复制构造函数。根据标准§12.8[class.copy] / 2,我们有:
X类的非模板构造函数是一个复制构造函数,如果它的第一个参数是X&类型,const X&,volatile X&或const volatile X&,并且没有其他参数,或者所有其他参数都有默认参数(8.3.6)。
同样,模板化版本也不是复制赋值运算符,根据§12.8[class.copy] / 17:
用户声明的复制赋值运算符X :: operator =是X类的非静态非模板成员函数,其中只有一个参数类型为X,X&,const X&,volatile X&或const volatile X&。
移动构造函数也是如此(在§12.8[class.copy] / 3):
X类的非模板构造函数是一个移动构造函数,如果它的第一个参数是X&&&&&&&&&&&&&&&&&&&没有其他参数,或者所有其他参数都有默认参数(8.3.6)。
并移动赋值运算符,见§12.8[class.copy] / 19:
用户声明的移动赋值运算符X :: operator =是类X的非静态非模板成员函数,其中只有一个类型为X&&&&&&&&&&&&&& amp;& ,或const volatile X&&。