std :: shared_ptr模板化与非模板化复制/移动构造函数

时间:2016-07-23 11:40:08

标签: c++ templates c++11 shared-ptr

This page表明std::shared_ptr具有模板化和非模板化版本的复制/移动构造函数(页面上的(9)和(10))。同样,它还有两个版本的复制/移动赋值运算符(参见here)。

为什么我们需要非模板化版本?模板化的版本不足以满足要求吗?

1 个答案:

答案 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&&。