在模板类C ++模板拷贝构造函数在模板类C ++模板拷贝构造函数(C++ template copy

2019-05-12 07:49发布

我有了一个模板拷贝构造函数模板类。 问题是,当我实例使用这个类具有相同的模板类型的另一个实例这个类,我的模板拷贝构造函数没有被调用。 为什么它不匹配?

以下是代码片段:

#include <iostream>

template <typename T>
class MyTemplateClass
{
    public:
        MyTemplateClass()
        {
            std::cout << "default constructor" << std::endl;
        }

        /*
        MyTemplateClass(const MyTemplateClass<T>& other)
        {
            std::cout << "copy constructor" << std::endl;
        }
        */

        template <typename U>
        MyTemplateClass(const MyTemplateClass<U>& other)
        {
            std::cout << "template copy constructor" << std::endl;
        }
};

int main()
{
    MyTemplateClass<int> instance;
    MyTemplateClass<int> instance2(instance);
    return EXIT_SUCCESS;
}

输出是

default constructor

但是,如果我明确写出默认的拷贝构造函数(通过取消注释它),然后输出变为

default constructor
copy constructor

我真的不明白这一点。 我跟我的本地编译器(铛500.2.79),并测试了这一个 (GCC 4.9.2),得到了相同的结果。

Answer 1:

副本构造函数的形式为X(X& )(X const&)并会被编译器提供你,如果你没有自己(或这里不涉及其他一些条件)申报一个。 你没有,所以含蓄我们有以下设置的候选人:

MyTemplateClass(const MyTemplateClass&);
template <typename U> MyTemplateClass(const MyTemplateClass<U>&);

两者都是可行的

MyTemplateClass<int> instance2(instance);

无论采取完全相同的参数。 问题不在于你的拷贝构造函数模板不匹配 。 问题是,隐含的拷贝构造函数不是一个函数模板,当涉及到重载非模板首选模板特。 从[over.match.best],省略了不相关的要点:

根据这些定义,一个可行的函数F1被定义为比另一个可行函数F2更好的功能,如果对所有的论点我, ICS(F1)不大于ICS (F2)更糟糕的转换序列,然后
- [...]
- F1不是一个函数模板专业化和F2是一个函数模板专业化,或者,如果不说,
- [...]

这就是为什么在你的构造函数模板调用您的暗示(然后,您明确)拷贝构造函数。



Answer 2:

当你没有在你的代码拷贝构造函数,编译器会隐式生成它。 因此,当执行该行:

MyTemplateClass<int> instance2(instance);

正在执行的拷贝构造函数,但显然不是你的。 我认为,模板无关吧。

了解更多关于在这里: 隐式定义的拷贝构造函数



Answer 3:

我认为REACHUS是正确的,编译器生成一个默认的拷贝构造函数(因为它会与非模板类也是如此),并宁愿这个在你的模板,因为它是更加专业化。 你应该让你的“正常”的拷贝构造函数私有,或更好,使用C ++ 11“被删除的”关键字标记功能不可用。 编辑:这不能编译,对不起,我没能在时间来检验。



文章来源: C++ template copy constructor on template class