【问题标题】:Copy constructor of template class模板类的复制构造函数
【发布时间】:2013-10-03 19:04:59
【问题描述】:

我读到模板 copy-con 永远不是默认复制 onstructor,模板 assignment-op 永远不是复制分配运算符。

我不明白为什么需要这个限制并立即上网到 ideone 并返回 test program 但这里复制构造函数永远不会被调用进一步谷歌搜索我遇到了模板化构造函数并尝试了但它仍然从不调用复制构造函数。

#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;
}

谁能解释一下设置这个限制的全部原因以及如何编写模板类的复制构造函数。

谢谢

【问题讨论】:

  • 没有“默认复制构造函数”。只有 一个 复制构造函数。模板绝不是它。
  • 我编辑了代码并在 ideone 中运行它,但仍然没有调用复制构造函数。但我也无法理解这种限制背后的原因

标签: c++


【解决方案1】:

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

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

就是这样。
这里的诀窍是,即使A 是一个模板,当您在类中将其称为A(例如在函数签名中)时,它也会被视为完整类型A&lt;T&gt;

【讨论】:

  • @Daniel 那是因为A&lt;T&gt; 也指类的完整类型,A 只是你可以在类内部使用的简写。
  • 也就是说构造函数也可以写成A(const A&lt;T&gt; &amp;){}
  • 似乎 A 在 C++20 中不起作用,需要纯 A...?
【解决方案2】:

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

  • 它不是模板。

  • 对于T 类,它的第一个参数的类型必须为T &amp;T const &amp;T volatile &amp;T const volatile &amp;

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

如果您不声明复制构造函数,则为您隐式声明形式为T::T(T const &amp;) 的复制构造函数。 (实际上可能定义了也可能没有定义,如果定义了也可能定义为删除。)

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

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

【讨论】:

猜你喜欢
  • 2016-03-22
  • 2015-12-08
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
相关资源
最近更新 更多