我读到,模板copy-con从来都不是默认的复制构造函数,而模板Assignment-op从来都不是副本分配运算符。
我不明白为什么需要这个限制,并且立即上线去ideone并返回一个测试程序,但是在这里,复制构造函数再也没有被调用过了。我遇到了模板化构造函数并尝试过,但是仍然没有调用复制构造函数。
#include <iostream>
using namespace std;
template <typename T> class tt
{
public :
tt()
{
std::cout << std::endl << " CONSTRUCTOR" << std::endl;
}
template <typename U> const tt<T>& operator=(const tt<U>& that){std::cout << std::endl << " OPERATOR" << std::endl;}
template <typename U> tt(const tt<U>& that)
{
std::cout << std::endl << " COPY CONSTRUCTOR" << std::endl;
}
};
tt<int> test(void)
{
std::cout << std::endl << " INSIDE " << std::endl; tt<int> a; return a;
}
int main() {
// your code goes here
tt<int> a ; a = test();
return 0;
}
有人可以向我解释施加此限制的全部原因,以及如何编写模板类的副本构造函数。
谢谢
有严格的规则构成复制构造函数(参见C ++ 11,12.8):
它不是模板。
对于类T
,其第一个参数必须具有类型T &
或T const &
或T volatile &
或T const volatile &
。
如果它具有多个参数,则其他参数必须具有默认值。
如果你不声明拷贝构造函数,形式的拷贝构造函数T::T(T const &)
是隐式声明为您服务。(它可能会或可能不会实际定义,如果已定义,则可能会定义为已删除。)
(通常的重载解决方案规则意味着您最多可以有四个副本构造函数,每个CV限定条件一个。)
移动构造函数有类似的规则,用&&
代替&
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句