不同类型的模板类复制构造:是否应遵循五法则?

时间:2019-07-19 15:10:41

标签: c++ templates constructor copy-constructor

我有以下课程:

template <typename T>
class A
{
public:
  A(const T& value): m_value(value)
  {
  }

  template <typename M>
  A(const A<M>& other): A(T(other.m_value))
  {
  }

private:
  T m_value;
};

此类应遵循Rule of Five吗?还是template <typename T>template <typename M> A<T>::A(const A<M>& other)不被视为副本构造函数?

2 个答案:

答案 0 :(得分:3)

存在五个规则是因为 if 您有一个副本构造函数,则可能是因为您不能使用自动生成的副本构造函数,而这又可能是因为您有一些间接需要被照顾。那样的话,您通常还需要在分配和销毁过程中加以照顾。

您拥有的不是副本构造函数。它从另一种类型转换。您的代码中没有指示成员m_value在分配或销毁期间需要特殊处理。此外,您执行执行的复制构造函数不会执行任何特殊操作。

如果您可以想到需要放入所述特殊成员函数中的某些代码,请继续进行操作。否则,您将不需要它们。

一般规则可能会有用,但是您最终仍然需要根据思想做出设计决策!您不会仅仅因为经验法则说您可能需要而实现功能。

答案 1 :(得分:1)

根据C ++标准(15.8.1复制/移动构造函数)

  

1如果满足以下条件,则类X的非模板构造函数是副本构造函数:   它的第一个参数是X&,const X&,volatile X&或const类型   易失性X&,或者没有其他参数,或者全部   其他参数具有默认参数

所以这个

  template <typename M>
  A(const A<M>& other): A(T(other.m_value))
  {
  }

不是副本构造函数。这是一个转换构造函数。

我在这里看不到与五法则的关系。