模板复制构造函数

template copy constructor

本文关键字:构造函数 复制      更新时间:2023-10-16

给定以下代码,Foo有复制构造函数吗?将Foo与STL容器一起使用安全吗?

class Foo
{
public:
   Foo() {}
   template <typename T>
   Foo(const T&) {}   
};

标准明确指出,复制构造函数是一个非模板化构造函数,它引用了可能是同一类型的const volatile对象。在上面的代码中,您有一个转换,但没有副本构造函数(即,它将用于副本的所有内容,其中将使用隐式声明的构造函数)。

Foo有复制构造函数吗?

是,隐式声明/定义的复制构造函数。

Foo与标准库容器一起使用安全吗?

对于Foo的当前定义,它是这样的,但在一般情况下,它取决于Foo具有哪些成员,以及隐式定义的复制构造函数是否正确管理这些成员。

根据标准,复制构造函数必须是以下签名之一:

Foo(Foo &);
Foo(Foo const &);
Foo(Foo volatile &);
Foo(Foo const volatile &);
Foo(Foo&, int = 0, );
Foo(Foo&, int = 0, float = 1.0); //i.e the rest (after first) of the 
                                 //parameter(s) must have default values!

由于代码中的模板构造函数与上述任何一种的形式都不匹配,即notcopy-构造函数。

Foo有一个编译器生成的复制构造函数,它不能被您提供的模板转换构造函数所取代。

Foo f0;
Foo f1(f0); // calls compiler-synthesized copy constructor
Foo f2(42); // calls template conversion constructor with T=int