20

我读到模板 copy-con 永远不是默认的复制 onstructor,模板 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;
}

有人可以解释一下设置此限制的全部原因以及如何编写模板类的复制构造函数。

谢谢

4

2 回答 2

25

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

  • 它不是模板。

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

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

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

(通常的重载决议规则意味着您最多可以有四个复制构造函数,每个 CV 限定一个。)

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

于 2013-10-03T19:12:25.533 回答
25

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

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

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

于 2013-10-03T19:12:56.290 回答