模板类上的c++模板复制构造函数
C++ template copy constructor on template class
我有一个模板类,它有一个模板复制构造函数。问题是,当我使用具有相同模板类型的该类的另一个实例实例化该类时,不会调用模板复制构造函数。为什么不匹配?
下面是代码片段:#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
我真的不明白。我用本地编译器(Clang 500.2.79)和这个编译器(GCC 4.9.2)测试了它,得到了相同的结果。
复制构造函数的形式为X(X& )
或(X const&)
,如果您没有自己声明一个(或其他一些与此无关的条件),则编译器将为您提供。你没有,所以我们隐式地有以下候选集合:
MyTemplateClass(const MyTemplateClass&);
template <typename U> MyTemplateClass(const MyTemplateClass<U>&);
对于
都是可行的MyTemplateClass<int> instance2(instance);
都接受完全相同的实参。问题不在于复制构造函数模板与不匹配。问题是隐式复制构造函数不是函数模板,当涉及到重载解析时,非模板优于模板专门化。从[over.match。最好],省略不相关的要点:
给定这些定义,一个可行函数F1被定义为比另一个可行函数更好的函数F2如果对于所有参数i, ICSi(F1)不是比ICSi(F2)更差的转换序列,然后
- - - - - -[…]
- F1不是函数模板专门化,F2是函数模板专门化,或者,如果不是,
- - - - - -[…]
这就是它在构造函数模板上调用隐式(然后是显式)复制构造函数的原因。
当代码中没有复制构造函数时,编译器将隐式生成它。因此,当执行这一行时:
MyTemplateClass<int> instance2(instance);
复制构造函数正在执行,但显然不是你的。我认为这与模板无关。
隐式定义复制构造函数我认为REACHUS是对的。编译器正在生成一个默认的复制构造函数(就像它对非模板类一样),并且更喜欢它而不是你的模板,因为它更专门化。
你应该使你的"普通"复制构造函数私有,或者更好的是,使用c++ 11的"deleted"关键字将函数标记为不可用。
但是,这不能编译。对不起,我当时无法测试它
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 复制构造函数、赋值运算符C++
- std::ofstream 作为类成员删除复制构造函数?
- 复制构造函数C++无法正确复制指针
- 关于复制构造函数的一个棘手问题
- 为什么调用复制构造函数而不是移动构造函数?
- 填充上编译器生成的复制构造函数之间的不一致
- C++ 对象指针数组的复制构造函数
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 防止在复制构造函数中隐式调用基构造函数
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 具有已删除移动和复制构造函数的类的就地构造
- 复制构造函数隐式转换问题
- 复制构造函数中的递归调用