我有以下课程:
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)
不被视为副本构造函数?
答案 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))
{
}
不是副本构造函数。这是一个转换构造函数。
我在这里看不到与五法则的关系。