模板 class 来自不同类型的复制构造函数:它应该遵循五规则吗?

Template class copy construcor from different type: should it follow the Rule of Five?

我有以下 class:

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

这个 class 应该跟在 Rule of Five 之后吗?或者template <typename T>template <typename M> A<T>::A(const A<M>& other)不被认为是拷贝构造函数?

根据 C++ 标准(15.8.1 Copy/move 构造函数)

1 A non-template constructor for class X is a copy constructor if its first parameter is of type X&, const X&, volatile X& or const volatile X&, and either there are no other parameters or else all other parameters have default arguments

所以这个

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

不是复制构造函数。它是一个转换构造函数。

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

五规则存在是因为如果你有一个复制构造函数那么那可能是因为你不能使用automatically-generated那个,这反过来可能是因为你有一些间接需要处理。这样的话,你通常也需要在赋值和销毁过程中处理它。

你拥有的不是拷贝构造函数。它从另一种类型转换而来。您的代码中没有迹象表明成员 m_value 在分配或销毁期间需要特殊处理。此外,您 执行的 copy-constructor 没有执行任何特殊操作。

如果你能想到一些需要放入所述特殊成员函数中的代码,那么就去做吧。否则,你不需要它们。

一般规则可能有用,但您最终还是需要基于思考来做出设计决策!您不会仅仅因为经验法则表明您可能需要而实现功能。