代码之家  ›  专栏  ›  技术社区  ›  Scott Mermelstein

如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数?

  •  1
  • Scott Mermelstein  · 技术社区  · 6 年前

    当模板构造函数中有一个参数是泛型参数时,应声明一个复制构造函数。

    我找不到任何东西可以用足够简单的术语解释为什么在这种情况下必须有一个复制构造函数。

    我看过 Copy constructor of template class C++ Template constructor, why is copy constructor being called?

    我应该寻找什么来确定违反此MISRA规则的代码是否在其当前代码库中造成了风险?

    1 回复  |  直到 6 年前
        1
  •  4
  •   Scott Mermelstein    6 年前

    除非您编写移动构造函数或移动赋值运算符,否则复制构造函数总是被定义的(在C++11之前可能被删除或未定义)。如果你不亲自声明,它是自动生成的。

    现在,我对米斯拉的了解还不足以确定你提到的规则背后的原因,所以我来猜猜它是什么。 如果您有一个带有单个泛型参数的模板构造函数,那么您所做的可能不仅仅是一个简单的复制,而且您可能错误地认为所有的复制构造都将通过这个模板构造函数来完成。但是,如果用同一类的另一个对象或从该类派生的对象复制构造该类的对象(具有模板构造函数的对象),则将调用自动生成的复制构造函数

    简而言之,通过提供一个复制构造函数,即使同时提供一个带有单个泛型参数的模板构造函数,也可以确保复制构造始终按预期工作。此外,还可以显式地向类的潜在用户显示,除了模板构造函数之外,该类还具有适当的复制构造函数。