复制模板类的构造函数

ano*_*ous 17 c++

我读到模板copy-con永远不是默认的onstructor,而模板赋值操作永远不是复制赋值操作符.

我无法理解为什么需要这个限制并立即上线到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;
}
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释这个限制背后的全部原因,以及如何编写模板类的复制构造函数.

谢谢

Ker*_* SB 23

什么构成复制构造函数有严格的规则(参见C++ 11,12.8):

  • 它不是模板.

  • 对于一类T,它的第一个参数的类型必须是T &T const &T volatile &T const volatile &.

  • 如果它有多个参数,则其他参数必须具有默认值.

如果您未声明复制构造函数,T::T(T const &)则会隐式声明表单的复制构造函数.(它可能实际上也可能没有实际定义,如果定义它可能被定义为已删除.)

(通常的重载决策规则意味着最多可以有四个复制构造函数,每个复制构造函数一个.)

移动构造函数有类似的规则&&,代替&.


Sir*_*Guy 22

我无法评论为什么会这样,但是这里是你为类模板编写复制构造函数和赋值运算符的方法:

    template <class T>
    class A
    {
      public:
        A(const A &){}
        A & operator=(const A& a){return *this;}
    };
Run Code Online (Sandbox Code Playgroud)

就是这样.
这里的诀窍是即使A是一个模板,当你在类中引用它时A(例如在函数签名中)它被视为完整类型A<T>.

  • @Daniel那是因为`A <T>`也指的是类的完整类型,`A`只是你可以在课堂上使用的简写. (4认同)